在partialview

时间:2017-02-07 02:53:13

标签: c# asp.net asp.net-mvc mvvm partial-views

我正在尝试使用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,所以工作。

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

1 个答案:

答案 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)