繁体   English   中英

MVC中嵌套的ViewModels / Partial View问题

[英]Nested ViewModels / Partial View problems in MVC

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

public class PartialViewModel 
{
    // properties, etc.
}

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

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

需要说明的是, 这两个视图都包含表单 ,部分视图表示表单之间的所有共享字段。 鉴于此,我有任何选择,还是我只是尝试做一些不符合MVC设计约束的事情?

你会想要设计一点不同的东西。 主视图将有一个模型 - 让我们称之为MainModel ,而部分View可以有一个模型 - 我们称之为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返回无效。

渲染局部视图时,您也可以将模型传递给它,如果设计得当,则可以从主视图的模型中访问部分需要的模型。

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

例如:

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

现在,我会将这些模型的创建委托给一家工厂,但是在进行重构之前,这种模型更先进而且没有必要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM