C# 多态自定义模型绑定器未填充带值的模型
我有一个自定义模型绑定器,用于根据包含原始类型的隐藏值返回相应的模型子类型 例如,在我的视图(EditorTemplate)中,我有: 然后,在我的自定义模型活页夹中,我有:C# 多态自定义模型绑定器未填充带值的模型,c#,asp.net-mvc,asp.net-mvc-3,model-binding,C#,Asp.net Mvc,Asp.net Mvc 3,Model Binding,我有一个自定义模型绑定器,用于根据包含原始类型的隐藏值返回相应的模型子类型 例如,在我的视图(EditorTemplate)中,我有: 然后,在我的自定义模型活页夹中,我有: protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) { var type
protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext, Type modelType)
{
var typeValue = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName + ".ModelType");
var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true);
var model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current
.GetMetadataForType(() => model, type);
return model;
}
typeValue
和type
变量被设置为适当的值(类型为TruckModel
),但在执行GetMetadataForType
之后,model
仍然填充有空值/默认值
我查看了几篇帖子(举几个例子),似乎我正在做这里解释的所有事情,但它仍然不适合我
关于视图/模型设置的更多详细信息,请参阅本主题中的my。正如@sydneyos在上述注释中所述,我的模型实际上正在填充,但显然在CreateModel方法中,返回的模型将不包含该点的值
在我的例子中,按照这个方法,我得到了一个
ArgumentNullException
,我认为这是由于模型没有被填充。但事实证明,这是不相关的,一旦修复了它,模型绑定就如预期的那样工作。我认为在这一阶段您会期望默认值-只有在调用GetPropertyValue之后,模型才会实际填充视图中的值-您是否使用了该方法?@sydneyos-您是对的,此时不应设置这些值。我始终无法看到这一点,因为在异常到达我的控制器之前抛出了一个异常(一个不相关的异常ArgumentNullException
,但我认为是相关的)。一旦我解决了这个问题,它就进入了我的控制器,正如你所说的,我的模型在这一点上被填充。如果你能把这个作为答案,我会接受的。谢谢
protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext, Type modelType)
{
var typeValue = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName + ".ModelType");
var type = Type.GetType((string)typeValue.ConvertTo(typeof(string)), true);
var model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current
.GetMetadataForType(() => model, type);
return model;
}