为了账号安全,请及时绑定邮箱和手机立即绑定

多态模型绑定

多态模型绑定

catspeake 2019-07-25 14:14:52
多态模型绑定这个问题问过在早期的MVC版本中。也有这篇博客文章一个解决问题的方法。我想知道MVC 3是否引入了可能有帮助的东西,或者是否还有其他选择。总之。情况就是这样。我有一个抽象的基模型和两个具体的子类。我有一个强类型视图,它将模型呈现为EditorForModel()..然后,我有自定义模板来呈现每个具体类型。这个问题是在事后发生的。如果我使POST操作方法以基类为参数,那么MVC就不能创建它的抽象版本(无论如何,我都不希望它创建实际的具体类型)。如果我创建了多个POST操作方法,这些方法仅随参数签名而变化,那么MVC会抱怨它不明确。据我所知,关于如何解决这个问题,我有几个选择。由于种种原因,我不喜欢它们中的任何一个,但我会在这里列出它们:创建自定义模型绑定,正如Darin在我链接的第一篇文章中所建议的那样。创建一个区分器属性,作为我链接到的第二个帖子。基于类型的发布到不同的动作方法???我不喜欢1,因为它基本上是隐藏的配置。其他一些从事代码开发的开发人员可能不知道这一点,并且浪费了大量的时间试图找出为什么在更改时事情会中断。我不喜欢2,因为它看起来有点烦人。但是,我倾向于这种方法。我不喜欢3,因为那意味着违反了干法。还有其他建议吗?编辑:我决定采用达林的方法,但做了一点小小的改变。我将其添加到抽象模型中:[HiddenInput(DisplayValue = false)]public string ConcreteModelType { get { return this.GetType().ToString(); }}然后在我的DisplayForModel()..你唯一要记住的是如果你不使用DisplayForModel()你得自己加进去。
查看完整描述

3 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

我刚刚想出了解决这个问题的办法。而不是像这样使用Parameterbsed模型绑定:

[HttpPost]public ActionResult Index(MyModel model) {...}

我可以使用TryUpdateModel()来确定在代码中绑定到哪种模型。例如,我做了这样的事情:

[HttpPost]public ActionResult Index() {...}{
    MyModel model;
    if (ViewData.SomeData == Something) {
        model = new MyDerivedModel();
    } else {
        model = new MyOtherDerivedModel();
    }

    TryUpdateModel(model);

    if (Model.IsValid) {...}

    return View(model);}

这实际上要好得多,因为如果我正在进行任何处理,那么我将不得不将模型转换为任何实际情况,或者使用is找出要使用AutoMapper调用的正确地图。

我想我们中那些从第一天起就没有使用MVC的人忘记了UpdateModelTryUpdateModel,但它仍然有它的用途。




查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 280 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信