我有一个主视图,其Model的类型为FacilityViewModel。主视图加载包含局部视图的局部视图。两个部分视图都具有FiltersViewModel类型的模型。最嵌套的部分视图循环遍历字典并为每个项创建一个复选框,以允许用户选择他们想要过滤其数据的工具。但是,一旦控件返回到我的控制器操作,_FacilityFilterPartialView中选择的项目就不会设置为true。字典中的每个值仍设置为false。我在应用程序的其他地方做同样的事情,使用一个不同的viewmodel结构,它工作正常。但由于某种原因,这是行不通的。我做错了什么?
的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.
}
}
答案 0 :(得分:2)
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;
}
}
答案 1 :(得分:1)
问题是您的控制名称与您的模型不匹配。您为name="FacilityList[xxxx]"
(其中xxxx
是字典键)的复选框生成html,但FacilityViewModel
没有名为FacilityList
的属性 - 只有名为{{1的属性()又包含一个名为Filters
)
要绑定到FacilityList
,复选框的name属性必须为FacilityViewModel
如果您在POST方法中只需要name="Filters.FacilityList[xxxx]"
,那么签名应为
FiltersViewModel
或者,如果您需要[HttpPost]
public ActionResult Index(FiltersViewModel model)
(假设它包含您未显示的其他属性),则需要确保FacilityViewModel
属性具有正确的前缀,这可以通过使用
name
和POST方法签名应为
@Html.Partial("_FiltersPartialView", Model.Filters, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Filters" }})
附注:绑定到您的模型,而不是[HttpPost]
public ActionResult Index(FacilityViewModel model)