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.HomeViewModel在Manage View部分视图中传递,那么它应该可以工作。
如何将视图模型变量传递给局部视图?
小智 5
HomeViewModel这意味着属性in的值HomeManageViewModel是null- 在将模型传递给视图之前,您没有在 GET 方法中初始化它,因此它的null. 当模型为 时null,该Partial()方法传递在主视图中声明的模型。
要么在 GET 方法中初始化HomeManageViewModel,HomeViewModel然后将模型传递给视图
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)