我有一个主视图,其Model为FacilityViewModel类型。主视图加载一个局部视图,该局部视图也包含一个局部视图。两个局部视图都有一个FiltersViewModel类型的模型。嵌套最深的局部视图遍历字典,并为每个项目创建一个复选框,以允许用户选择他们要用来过滤数据的工具。但是,一旦控件返回到我的控制器动作,在_FacilityFilterPartialView中选择的项就不会设置为true。字典中的每个值仍设置为false。我在应用程序的其他地方也执行了相同的操作,但视图模型的结构略有不同,并且工作正常。但是由于某种原因,这是行不通的。我究竟做错了什么?

ViewModels:

public class FiltersViewModel
{
    public Dictionary<string, bool> FacilityList { get; set; }
}

public class FacilityViewModel
{
    public FiltersViewModel Filters { get; set; }

}


_FacilityFilterPartialView:

@model MyApp.ViewModel.FiltersViewModel

@foreach (var key in Model.FacilityList.Keys)
{
    <label style="white-space:nowrap">
        @Html.CheckBoxFor(r => r.FacilityList [key], new { @class = "fChkbox" })
        @Html.DisplayFor(r => key, new { @style = "nowrap" })
    </label>
}
</div>


_FiltersPartialView.cshtml:

@model MyApp.ViewModel.FiltersViewModel

@using (Html.BeginForm())
{
    @Html.Partial("_FacilityFilterPartialView", @Model)
    ...
}


主视图Index.cshtml:

@model MyApp.ViewModel.FacilityViewModel
<div>
    @Html.Partial("_FiltersPartialView", Model.Filters)
</div>


控制器代码:

viewModel的类型为FacilityViewModel

[HttpPost]
public ActionResult Index(FormCollection fc)
{
   if (ModelState.IsValid)
   {
      TryUpdateModel(viewModel);
      //State of checkboxes is not correct at this point.
   }
 }

最佳答案

asp.net MVC模型绑定只能绑定到一个模型。要解决您的问题,您只需要创建一个基类,您的所有模型(可能使用FacilityList)都将派生自该基类。

像这样:

public class FacilityViewModel
{
    public Dictionary<string, bool> FacilityList { get; set; }
}


那么您的FiltersViewModle看起来就像

public class FiltersViewModel : FacilityViewModel
{
    public FiltersViewModel Filters { get; set; }
}


一旦就位,您将需要更改控制器的参数以采用FiltersViewModel

[HttpPost]
public ActionResult Index(FiltersViewModel viewModel)
{
   if (ModelState.IsValid)
   {
      var test = viewModel.FacilityList;
   }
 }

07-25 20:40