我有一个课程如下:
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);
}
答案 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"设置了一个模型绑定器。类型。所以它使用我的自定义活页夹来完成我需要做的事情。