MVC中的嵌套视图模型/部分视图问题

本文关键字:视图 问题 模型 嵌套 MVC | 更新日期: 2023-09-27 18:29:16

我有两个视图:一个是局部视图,另一个是使用@Html.RenderPartial("_PartialView")封装局部视图的视图。每个都有自己的ViewModel:

public class PartialViewModel 
{
    // properties, etc.
}
public class MainViewModel 
{
    public PartialViewModel p { get; set; }
    // properties, etc.
}

当我加载第二个视图(使用MainViewModel的视图)时,我会遇到字典错误,因为这个视图和它封装的部分视图使用了两个不同的ViewModel。我不能让它们使用相同的ViewModel,因为局部视图是在许多其他不同的视图中渲染的。

需要明确的是,这两个视图都包含表单,部分视图表示表单之间的所有共享字段。考虑到这一点,我有什么选择吗?还是我只是试图做一些不符合MVC设计约束的事情?

MVC中的嵌套视图模型/部分视图问题

您会希望以不同的方式进行设计。主视图将有一个模型——我们称之为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返回为void

当您渲染部分视图时,您也可以将模型传递给它,如果它设计正确,那么部分需要的模型将已经可以从主视图的模型访问

您可以这样做,但在控制器中,您需要声明一个新的MainViewModel,并为其PartialViewModel分配一个新PartialViewModel。

例如:

public class Controller {
    public ActionResult Index(){
        var mainViewModel = new MainViewModel { PartialViewModel = new PartialViewModel() };
        return View(mainViewModel);
    }
}

现在,我将把这些模型的创建委托给一个工厂,但这更高级,在进行重构之前没有必要。