【问题标题】:Using asp.net mvc model binders generically一般使用 asp.net mvc 模型绑定器
【发布时间】:2009-11-14 01:10:47
【问题描述】:

我有一个类的层次结构,这些类都派生自一个基类型,并且该基类型还实现了一个接口。我想要做的是有一个控制器来处理整个层次结构的管理(因为通过控制器公开的操作是相同的)。话虽如此,我希望视图上有特定于类型的字段,并且模型绑定器可以绑定到隐藏字段值。类似:

<input type="text" name="model.DerivedTypeSpecificField" />
<input type="hidden" name="modelType" value="MyDerivedType" />

话虽如此,asp.net mvc 模型绑定器似乎需要它们将创建的具体类型,因此我需要为每个派生类型创建不同的控制器。

有没有人这样做过或知道如何操纵模型绑定器以这种方式运行?我可以编写自己的模型绑定器,但除了分配属性和在目标类型上构建数组的基本模型绑定行为之外,我不想要任何东西。

谢谢!

【问题讨论】:

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


    【解决方案1】:

    不知道是否可行,但您可以尝试以下方法:

    public class MyBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            bindingContext.ModelType = System.Type.GetType(controllerContext.HttpContext.Request["modelType"]);
    
            return base.BindModel(controllerContext, bindingContext);
        }
    }
    

    这只是基本模型绑定器的简单更改。

    【讨论】:

    • 我想通了。除了我从 ValueProviders 数组中获取 modelType 之外,我的解决方案几乎与您的解决方案相同。谢谢!
    【解决方案2】:

    查看 MvcContrib 中的派生类型 ModelBinder。这允许您通过“typestamping”过程对派生类型进行模型绑定 - 在使用 RenderTypedPartial(...) 帮助程序时会自动为您处理。 MvcContrib 部分维护跨部分的绑定状态,因此名称/ID 前缀在深层对象图中得到正确维护。如果您使用模板等其他机制,那么您需要自己处理类型标记。这在文档页面中有说明。

    回到您的问题以及如何使用 ModelBinder 解析派生类型,您可以使用类似于 WCF KnownTypeAttribute 的机制注册派生类型变体,或者您可以在启动时进行注册。无论哪种方式,这些变化都会被注册一次并出于性能考虑而保留。

    模型绑定器还以不干扰数据注释/验证属性的方式解决了这个问题。在任何其他情况下,它们都会按照您的预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2015-04-17
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      相关资源
      最近更新 更多