在局部视图中传递不同的视图模型

hel*_*llo -1 c# asp.net asp.net-mvc partial-views mvvm

我正在尝试使用 PartialView 使用下面的代码在多个视图之间共享表单:

这是我想在实现部分视图的所有视图之间共享的模型

namespace CSharp.Models.ViewModels
{
   public class HomeViewModel
   {
      public string County { get; set; }
      public ElectionType? Type { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

部分视图文件如下所示:

@model CSharp.Models.ViewModels.HomeViewModel
@Html.TextBoxFor(model => model.County, new { @class = "form-control" })      
@Html.EnumDropDownListFor(model => model.Type, null, new { @class = "form-control"})
Run Code Online (Sandbox Code Playgroud)

在需要实现部分视图的文件之一中,我有以下代码:

Home View

@model CSharp.Models.ViewModels.HomeViewModel
@using (Html.BeginForm("Index", "Result", new { ViewBag.ReturnUrl }, FormMethod.Get, new { role = "form" }))
{
   @Html.ValidationSummary(true, "", new { @class = "text-danger" })
   @Html.Partial("~/Views/Shared/_PartialViewFile.cshtml", Model)
}
Run Code Online (Sandbox Code Playgroud)

当我运行该页面时,它按预期工作。

另一个需要部分视图的页面,我有一个使用 ViewModel 的视图

Manage View
@model CSharp.Models.ViewModels.HomeManageViewModel
<form >
    @Html.Partial("~/Views/Shared/_PartialViewFile.cshtml", Model.HomeViewModel);
</form>
Run Code Online (Sandbox Code Playgroud)

HomeManageViewModel看起来像这样

public class HomeManageViewModel
{
    public HomeViewModel HomeViewModel { get; set; }
    public IndexViewModel ManageViewModel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我运行时Manage View,我收到此错误:

传递到字典中的模型项的类型为“HomeManageViewModel”,但该字典需要类型为“HomeViewModel”的模型项

我想既然我实际上是Model.HomeViewModelManage View部分视图中传递,那么它应该可以工作。

如何将视图模型变量传递给局部视图?

小智 5

HomeViewModel这意味着属性in的值HomeManageViewModelnull- 在将模型传递给视图之前,您没有在 GET 方法中初始化它,因此它的null. 当模型为 时null,该Partial()方法传递在主视图中声明的模型。

要么在 GET 方法中初始化HomeManageViewModelHomeViewModel然后将模型传递给视图

var model = new HomeManageViewModel()
{
    HomeViewModel = new HomeViewModel(){ .... }
}
return View(model);
Run Code Online (Sandbox Code Playgroud)

或者在视图中,您可以使用

@Html.Partial("_PartialViewFile", new HomeViewModel());
Run Code Online (Sandbox Code Playgroud)

但请注意,您的代码将无法在表单中运行,因为 aHtml.Partial()不会为模型绑定生成正确的名称前缀。相反,使用EditorTemplate. 将partial的名称更改为HomeViewModel.cshtml-,以匹配类的名称,并将其放置在Views/Shared/EditorTemplates文件夹(或Views/yourControllerName/EditorTemplates文件夹)中,然后在主视图中,使用

@Html.EditorFor(m => m.HomeViewModel)
Run Code Online (Sandbox Code Playgroud)