Asp.net mvc 2 ModelBinder、复杂嵌套类型和接口

Asp.net mvc 2 ModelBinder、复杂嵌套类型和接口,asp.net-mvc-2,modelbinders,Asp.net Mvc 2,Modelbinders,我有一个需要绑定到接口的场景——为了创建正确的类型,我有一个定制的模型绑定器,它知道如何创建正确的具体类型(可以不同) 但是,创建的类型从未正确填写字段。我知道我在这里忽略了一些非常简单的东西,但是有人能告诉我为什么或者至少我需要为模型绑定器做些什么来继续它的工作并绑定属性吗 public class ProductModelBinder : DefaultModelBinder { override public object BindModel (ControllerContext

我有一个需要绑定到接口的场景——为了创建正确的类型,我有一个定制的模型绑定器,它知道如何创建正确的具体类型(可以不同)

但是,创建的类型从未正确填写字段。我知道我在这里忽略了一些非常简单的东西,但是有人能告诉我为什么或者至少我需要为模型绑定器做些什么来继续它的工作并绑定属性吗

public class ProductModelBinder : DefaultModelBinder
{
    override public object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType == typeof (IProduct))
        {
            var content = GetProduct (bindingContext);

            return content;
        }

        var result = base.BindModel (controllerContext, bindingContext);

        return result;
    }

    IProduct GetProduct (ModelBindingContext bindingContext)
    {
        var idProvider = bindingContext.ValueProvider.GetValue ("Id");
        var id = (Guid)idProvider.ConvertTo (typeof (Guid));

        var repository = RepositoryFactory.GetRepository<IProductRepository> ();
        var product = repository.Get (id);

        return product;
    }
}

ModelBinder是递归工作的,所以您需要实现一个自定义的ModelBinder,重写其中的onCreate和BindModel方法

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
// get actual type of a model you want to create here
    return Activator.CreateInstance(type);
}

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    // here our CreateModel method will be called
    var model = base.BindModel(controllerContext, bindingContext);
    // we will get actual metadata for type we created in the previous line
    var metadataForItem = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType());
    // and then we need to create another binding context and start model binding once again for created object
    var newModelBindingContext = new ModelBindingContext
        {
            ModelName = bindingContext.ModelName,
            ModelMetadata = metadataForItem,
            ModelState = bindingContext.ModelState,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = bindingContext.ValueProvider
        };
        return base.BindModel(controllerContext, newModelBindingContext);
}


希望对您有所帮助。

ModelBinder是递归工作的,所以您需要做的是实现一个自定义的ModelBinder,重写其中的onCreate和BindModel方法

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
// get actual type of a model you want to create here
    return Activator.CreateInstance(type);
}

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    // here our CreateModel method will be called
    var model = base.BindModel(controllerContext, bindingContext);
    // we will get actual metadata for type we created in the previous line
    var metadataForItem = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType());
    // and then we need to create another binding context and start model binding once again for created object
    var newModelBindingContext = new ModelBindingContext
        {
            ModelName = bindingContext.ModelName,
            ModelMetadata = metadataForItem,
            ModelState = bindingContext.ModelState,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = bindingContext.ValueProvider
        };
        return base.BindModel(controllerContext, newModelBindingContext);
}

希望有帮助