public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext) { ComplexModelDto dto = bindingContext.Model as ComplexModelDto; if (dto == null) { return false; } foreach (ModelMetadata medadata in dto.PropertyMetadata) { ModelBindingContext subcontext = new ModelBindingContext(bindingContext) { ModelMetadata = medadata, //创建前缀形式的ModelName ModelName = ModelNameBuilder.CreatePropertyModelName(bindingContext.ModelName, medadata.PropertyName) }; if (actionContext.Bind(subcontext)) { dto.Results[medadata] = new ComplexModelDtoResult(subcontext.Model, subcontext.ValidationNode); } } return true; // 在实现的BindModd方法中,如果当前Modc1BindiⅡ gContext 的Modcl属 性不是一个CompIexModolDto对象, //我们会直接返回Fdsc。 接下来针对描述属 性的每个Mo山;lMetadata创 建当前ModeIBindingContext的 子上下文 //,然 后调用当前 IIttpActioⅡContc灶 的Bi血 方法针对它实施新—轮的Mode1绑 定。Mode1绑 定成功完成之后 , //作为子上下文的ModeIBiΠdiⅡgContext中 将包含属性对应的值和验证结果,我们将它们添加 到ComplexMo山 lDto //的 Results属 性中,Mut汕 1co切ectModelBhder为 空对象设置的属性值 就来源于此。 }
public void NestedFrom() { var xs = new[] { 1, 2, 3 }; var ys = new[] { 10, 15, 20 }; var zs = new[] { 0, 1, 0, 1 }; var res = from x in xs from y in ys from z in zs select Create.Tuple(x, y, z); Assert.That(res, Is.EqualTo(xs.Bind(x => ys.Bind(y => zs.Bind(z => new[] { Create.Tuple(x, y, z) }))))); }
public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext) { if (!CanBindType(bindingContext.ModelType)) { return false; } if (!bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName))//前缀检查,查看valueprovider是否提供了该名称的数据 { return false; } //创建目标类型的空对象 bindingContext.Model = Activator.CreateInstance(bindingContext.ModelType); //创建针对目标类型的ComplexModelDto ComplexModelDto dto = new ComplexModelDto(bindingContext.ModelMetadata, bindingContext.PropertyMetadata.Values); ///创建一个子ModelBindingContext用于作为参数,直接调用HttpActionContextExtensions的里对HttpActionContext的扩展方法,进行模型绑定,命名空间:System.Web.Http.Controllers; ModelBindingContext subContext = new ModelBindingContext(bindingContext) { ModelMetadata = actionContext.GetMetadataProvider().GetMetadataForType(() => dto, typeof(ComplexModelDto)), ModelName = bindingContext.ModelName }; ///,直接调用HttpActionContextExtensions的里对HttpActionContext的扩展方法Bind,进行模型绑定,命名空间:System.Web.Http.Controllers; actionContext.Bind(subContext); foreach (KeyValuePair<ModelMetadata, ComplexModelDtoResult> item in dto.Results) { ModelMetadata metadata = item.Key; ComplexModelDtoResult result = item.Value; if (result != null) { /// PropertyInfo propertyinfo = bindingContext.ModelType.GetProperty(metadata.PropertyName); ///实现在Bin(l方 法之中的ModeI绑定完成之后,目 标对象相应的属性值将会保存到 CompIexMode1Dto对象的Rcsults属 性中。我们直接从中获取相应的属性值,并对创建的空 //对象对应的非只读属性进行赋值即可。 if (propertyinfo.CanWrite) { propertyinfo.SetValue(bindingContext.Model, result.Model); } } } return true; }
public void BindTest() { var collection = new[] { Maybe.Just(1), Maybe.Nothing, Maybe.Just(2) }; var result = collection.Bind(x => x == 1 ? Maybe.Just(3) : Maybe.Nothing); Assert.AreEqual(result, new[] { Maybe.Just(3), Maybe.Nothing, Maybe<int>.Nothing }); }