部分视图的复选框状态未返回到控制器

时间:2015-06-18 15:32:18

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

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

2 个答案:

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