我正在尝试使用PartialView使用下面的代码在多个视图中共享表单:
这是我希望在实现部分视图的所有视图中共享的模型
namespace CSharp.Models.ViewModels
{
public class HomeViewModel
{
public string County { get; set; }
public ElectionType? Type { get; set; }
}
}
部分查看文件如下所示:
@model CSharp.Models.ViewModels.HomeViewModel
@Html.TextBoxFor(model => model.County, new { @class = "form-control" })
@Html.EnumDropDownListFor(model => model.Type, null, new { @class = "form-control"})
在其中一个需要实现局部视图的文件中,我有以下代码:
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)
}
当我运行页面时,它可以正常工作。
需要部分视图的另一个页面,我有一个使用ViewModel的视图
Manage View
@model CSharp.Models.ViewModels.HomeManageViewModel
<form >
@Html.Partial("~/Views/Shared/_PartialViewFile.cshtml", Model.HomeViewModel);
</form>
HomeManageViewModel
看起来像这样
public class HomeManageViewModel
{
public HomeViewModel HomeViewModel { get; set; }
public IndexViewModel ManageViewModel { get; set; }
}
当我运行Manage View
时,我收到此错误:
传递到字典中的模型项的类型为“HomeManageViewModel”,但此字典需要“HomeViewModel”类型的模型项
我想,因为我实际上在Model.HomeViewModel
部分视图中传递了Manage View
,所以应工作。
如何将视图模型变量传递给局部视图?
答案 0 :(得分:4)
这意味着HomeViewModel
中的属性HomeManageViewModel
的值为null
- 在将模型传递给视图之前,您没有在GET方法中初始化它,因此它的null
1}}。当模型为null
时,Partial()
方法会传递主视图中声明的模型。
在GET方法中初始化HomeManageViewModel
及其HomeViewModel
,并将模型传递给视图
var model = new HomeManageViewModel()
{
HomeViewModel = new HomeViewModel(){ .... }
}
return View(model);
或在视图中,您可以使用
@Html.Partial("_PartialViewFile", new HomeViewModel());
但请注意,您的代码无法在表单中使用,因为Html.Partial()
不会为模型绑定生成正确的名称前缀。而是使用EditorTemplate
。将部分名称更改为HomeViewModel.cshtml
- 以匹配类的名称,并将其放在Views/Shared/EditorTemplates
文件夹(或Views/yourControllerName/EditorTemplates
文件夹)中,然后在主视图中,使用
@Html.EditorFor(m => m.HomeViewModel)