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为 空对象设置的属性值 就来源于此。
        }
Exemplo n.º 2
0
 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) })))));
 }
Exemplo n.º 3
0
        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 });
		}