Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
Asp.net mvc 4 ASP.NET MVC视图模型继承问题_Asp.net Mvc 4_Viewmodel - Fatal编程技术网

Asp.net mvc 4 ASP.NET MVC视图模型继承问题

Asp.net mvc 4 ASP.NET MVC视图模型继承问题,asp.net-mvc-4,viewmodel,Asp.net Mvc 4,Viewmodel,我有以下视图模型: public class MyViewModel { public BaseViewModel mySubViewModel; } public class ChildViewModel: BaseViewModel {} 然后,我创建了一个MyViewModel模型,其中包含ChildViewModel类型的属性。在视图中,它显示得很好 然后,我点击save(保存)按钮向我的模型提交更改,并调用以下控制器: [HttpPost] public Act

我有以下视图模型:

public class MyViewModel
{
  public BaseViewModel mySubViewModel;
}

public class ChildViewModel: BaseViewModel
{}
然后,我创建了一个MyViewModel模型,其中包含ChildViewModel类型的属性。在视图中,它显示得很好

然后,我点击save(保存)按钮向我的模型提交更改,并调用以下控制器:

    [HttpPost]
    public ActionResult Edit(MyViewModel model)
    {
        return null;
    }
令我惊讶的是,mySubViewModel属性现在的类型是BaseViewModel,而不是ChildViewModel!我不知道这里发生了什么。我做错了什么

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

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


因此,一种可能性是编写一个自定义模型绑定器,它将实例化您希望的视图模型的具体实例。我已经举例说明了这样一个自定义模型活页夹在。在本例中,我在表单中包含了一个隐藏字段,该字段将包含我们希望实例化的视图模型的具体类型,然后自定义模型绑定器仅在运行时使用此信息创建此类型。

另一种方法是在
MyViewModel
ChildViewModel
。是的,那也行。但我猜OP不知道要使用的确切运行时类型,也不希望对其进行硬编码,这就是为什么他使用基类型作为其操作的参数。完全正确,我只知道运行时的类型。我今天没有时间查看你的链接,但我一定会在读完这篇文章后再联系你。非常感谢你的帮助。事实上,我找到了时间查看你的链接。模型活页夹确实是我应该使用的。我对你在帖子中建议的代码只有一个问题。将modelType参数传递给CreateModel方法,但从未使用此参数。代码中的某个地方有错别字吗?不,根本不是错别字。自定义模型绑定器使用此参数来了解它应该实例化的具体类型。查看模型绑定器中的以下行:
var-typeValue=bindingContext.ValueProvider.GetValue(bindingContext.ModelName+“.ModelType”)。注意后缀?没有这个隐藏的值,模型绑定器就不知道应该实例化哪个具体的视图模型,哪个是您最初的问题。