【问题标题】:Polymorphic custom model binder not populating model w/ values多态自定义模型绑定器不使用值填充模型
【发布时间】:2011-11-15 22:51:19
【问题描述】:

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

例如,在我看来(EditorTemplate)我有:

@model MyWebApp.Models.TruckModel
@Html.Hidden("ModelType", Model.GetType())
@Html.EditorFor(m => m.CabSize)

然后,在我的自定义模型绑定器中,我有:

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

typeValuetype 变量正在设置为适当的值(类型为 TruckModel),但在执行 GetMetadataForType 之后,model 仍然填充了空值/默认值。

我查看了几篇帖子(herehere 仅举几例),似乎我正在按照这里的说明做所有事情,但它仍然不适合我。

您可以通过参考我关于此主题的previous post 找到有关视图/模型设置的更多详细信息。

【问题讨论】:

  • 我认为您在这个阶段会期望默认值 - 只有在调用 GetPropertyValue 之后,模型才会实际填充视图中的值 - 您是否逐步完成了该方法?
  • @sydneyos - 你是对的,此时不应该设置这些值。由于在它进入我的控制器之前抛出了一个异常(一个不相关的异常ArgumentNullException,但我认为是相关的),我永远无法看到这一点。一旦我解决了这个问题,它就会出现在我的控制器上,正如你所说,我的模型此时已填充。如果您可以将此作为答案发布,我会接受。谢谢。

标签: c# asp.net-mvc asp.net-mvc-3 model-binding


【解决方案1】:

正如@sydneyos 在上面的 cmets 中所说,我的模型实际上正在填充,但显然在 CreateModel 方法中,返回的模型将不包含该点的值。

在我的例子中,我在这个方法之后得到了一个ArgumentNullException,我认为这是由于模型没有被填充。但事实证明,这是不相关的,一旦解决了这个问题,模型绑定就会按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 2012-07-31
    • 1970-01-01
    • 2012-02-18
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多