asp.net-mvc-4 - ASP.NET MVC ViewModel 继承问题

标签 asp.net-mvc-4 viewmodel

我有以下 View 模型:

public class MyViewModel
{
  public BaseViewModel mySubViewModel;
}

public class ChildViewModel: BaseViewModel
{}

然后我创建一个 MyViewModel 模型,其中包含一个 ChildViewModel 类型的属性。在 View 中,它显示得很好。

然后我点击保存按钮将更改提交到我的模型并调用以下 Controller :

    [HttpPost]
    public ActionResult Edit(MyViewModel model)
    {
        return null;
    }

令我惊讶的是,属性 mySubViewModel 现在是 BaseViewModel 而不是 ChildViewModel 类型!我不知道这里发生了什么。我究竟做错了什么 ?

最佳答案

To my surprise, the property mySubViewModel is now of type BaseViewModel instead of ChildViewModel ! I have no idea what's going on here. What am I doing wrong ?

您不应该对此感到惊讶。你没有做错任何事。这是设计使然。默认模型绑定(bind)器看到您的 Controller 操作正在采用 MyViewModel 参数并尝试将 POST 请求的内容绑定(bind)到它。默认模型绑定(bind)器绝对无法知道您可能已经编写了一些派生类(例如 ChildViewModel 在您的情况下)并且您希望在此处实例化这些派生类。您已将此具体 View 模型实例从 GET 操作传递到 View 这一事实对 POST 操作没有影响。从 HTTP 和默认模型绑定(bind)器看到的内容的角度来考虑它。例如,可以从一些完全不同的客户端而不是从表单提交调用此 POST 操作。例如,可以是 iPhone 应用程序对 POST 操作执行 HTTP 请求。看,现在它完全有道理。默认模型绑定(bind)器只能看到 POST 请求的有效负载和您指定为操作参数的类型。这就是他所做的 => 它实例化此类型并从 POST 有效负载数据绑定(bind)其属性。

因此,一种可能性是编写一个自定义模型绑定(bind)器,它将实例化您希望的 View 模型的具体实例。我在 this post 举例说明了这样一个自定义模型 Binder .在这个例子中,我在表单中包含了一个隐藏字段,它将包含我们想要实例化的 View 模型的具体类型,然后自定义模型绑定(bind)器仅使用此信息在运行时创建此类型。

关于asp.net-mvc-4 - ASP.NET MVC ViewModel 继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14667263/

相关文章:

javascript - Ajax POST int 到 MVC

asp.net-mvc - 'ServiceStack.MiniProfiler.IHtmlString' 不包含 'AsRaw' 的定义

asp.net-mvc - WriteAttributeTo 方法中的空引用异常

css - 如何将媒体属性添加到 ASP.NET MVC4 样式包

c# - 在 View 模型中创建控件实例

wpf - 在WPF中使用MVVM,我应该从后面的View代码或ViewModel启动子窗口吗?

c# - Nullable<> 作为 ViewPage 的 TModel

asp.net-mvc - 如何将 HTML5 表单操作链接到 ASP.NET MVC 4 中的 Controller ActionResult 方法

wpf - MVVM 中 View 模型的交互

c# - 如何在viewmodel(MVVM模型)wpf应用程序中使用命令行参数