我有一个主视图,其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;
}
}