Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多态自定义模型绑定器未填充带值的模型_C#_Asp.net Mvc_Asp.net Mvc 3_Model Binding - Fatal编程技术网

C# 多态自定义模型绑定器未填充带值的模型

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

我有一个自定义模型绑定器,用于根据包含原始类型的隐藏值返回相应的模型子类型

例如,在我的视图(EditorTemplate)中,我有:

然后,在我的自定义模型活页夹中,我有:

    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;
    }