在模型绑定期间更改模型属性对象类型

时间:2015-03-19 19:12:23

标签: .net model-binding

我有一个课程如下:

class A{ //my main model
public int A {get;set;}
public object obj {get;set;} //declared as object
}

class B{public string BB {get;set;}}
class C{public string CC {get;set;}}

我宣布"对象"因为我有一个不同型号的视图。在模型绑定事件期间,我能够更改"对象"键入适当的对象。我面临的问题是对象无法获得其属性值(即BB = null)

protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
    {
        if (propertyDescriptor.Name == "obj")
        {
            string productType = bindingContext.ValueProvider.GetValue("GenericModelType").AttemptedValue;
            Type instantiationType = Type.GetType(productType);
            var obj = Activator.CreateInstance(instantiationType);
            propertyDescriptor.SetValue(bindingContext.Model, obj);
            return obj;
        }
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }

1 个答案:

答案 0 :(得分:1)

我不知道每个对象都可以绑定到模型绑定器。以下是我为解决问题所做的工作:

public class ObjectModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ValueProvider.ContainsPrefix("GenericModelType"))
        {
            //get the model type
            var typeName = (string)bindingContext
                .ValueProvider
                .GetValue("GenericModelType")
                .ConvertTo(typeof(string));
            var modelType = Type.GetType(typeName);

            //tell the binder to use it
            bindingContext.ModelMetadata =
                ModelMetadataProviders
                .Current
                .GetMetadataForType(null, modelType);
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

这里发生的是在模型绑定事件期间,它将首先尝试绑定我的主模型(A)并且它检测到一个"列表"属性。由于我的模型定义了" list"作为对象,它将尝试绑定创建对象类型。但是,我已经为" object"设置了一个模型绑定器。类型。所以它使用我的自定义活页夹来完成我需要做的事情。