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

ale*_*lex 5 c# asp.net-mvc mvvm

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

public class PartialViewModel 
{
    // properties, etc.
}

public class MainViewModel 
{
    public PartialViewModel p { get; set; }
    // properties, etc.
}
Run Code Online (Sandbox Code Playgroud)

加载第二个视图(使用MainViewModel的视图)时出现字典错误,因为此视图及其封装的局部视图使用两种不同的ViewModel。我不能让它们使用相同的ViewModel,因为局部视图是在许多其他不同视图中呈现的。

为了清楚起见,这两个视图都包含form,部分视图表示表单之间的所有共享字段。鉴于此,我是否有其他选择,还是只是尝试做一些不符合MVC设计约束的事情?

Sco*_*lby 4

你会想要稍微不同地设计它。主视图将有一个模型 - 我们称之为模型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();
    }
}
Run Code Online (Sandbox Code Playgroud)

那么你的主视图将会有

@model MainViewModel
Run Code Online (Sandbox Code Playgroud)

然后在主视图的中间你有类似的东西

@{ Html.RenderPartial("myPartialView", Model.Partial); }
Run Code Online (Sandbox Code Playgroud)

请注意 Html.RenderPartial 周围的大括号。需要它们是因为 RenderPartial 返回无效。

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