我有两个视图:部分视图和使用@Html.RenderPartial("_PartialView")
封装局部视图的视图。每个都有自己的ViewModel:
public class PartialViewModel
{
// properties, etc.
}
public class MainViewModel
{
public PartialViewModel p { get; set; }
// properties, etc.
}
当我加载第二个视图(使用MainViewModel的视图)时,我收到字典错误,因为这个视图和它封装的部分视图使用了两个不同的ViewModel。我无法使用相同的ViewModel,因为部分视图会在许多其他不同的视图中呈现。
要清楚both of these views contain forms,部分视图表示表单之间的所有共享字段。鉴于此,我有任何选择,或者我只是尝试做一些不符合MVC设计约束的事情?
答案 0 :(得分:3)
你想要以不同的方式设计它。主视图将有一个模型 - 让我们称之为MainModel
,部分视图可以有一个模型 - 我们称之为PartialModel
public class PartialModel
{
/// props
}
public class MainViewModel
{
public PartialModel Partial { get; set; }
// properties, etc.
// per comments in other answer you may want something like this
public MainViewModel()
{
Partial = new PartialModel();
}
}
然后你的主视图将有
@model MainViewModel
然后在主视图的中间你有类似
的东西@{ Html.RenderPartial("myPartialView", Model.Partial); }
注意Html.RenderPartial周围的大括号。因为RenderPartial返回无效,所以需要它们。
渲染局部视图时,您也可以将模型传递给它,如果设计得当,那么部分需要的模型可以从主视图的模型中访问
答案 1 :(得分:2)
您可以这样做,但在您的控制器中,您需要声明一个新的MainViewModel并为其PartialViewModel分配一个新的PartialViewModel。
例如:
public class Controller {
public ActionResult Index(){
var mainViewModel = new MainViewModel { PartialViewModel = new PartialViewModel() };
return View(mainViewModel);
}
}
现在,我会将这些模型的创建委托给工厂,但是在进行重构之前,这种模型更先进而且没有必要。