MVC3将字典<string,bool>从视图传递到控制器</string,bool>

时间:2012-08-09 03:26:29

标签: c# asp.net asp.net-mvc-3 view

我需要在表单上显示一些复选框,用户可以根据需要查看。

所以我在Database上存储了复选框选项。 (所需的)

模型

public class Options
{
    public int OptionsId {get; set;}
    public string Option {get; set;}
}

在viewModel上,

IEnumerable<Options> listCheckBoxOptions {get; set;}// store list of options from database
Dictionary<string,bool> checkboxs {get; set;} // store if is check or not

因此,在视图中,我想在此复选框字典中存储复选框值(true / false)。

@foreach (var x in Model.listCheckBoxOptions)
     {                  
           @Html.CheckBoxFor(m => m.checkboxs[x.Option])
           @m.Option <br />                             
     } 

所以当我提交表单时...当到达控制器时,复选框为空。

知道为什么吗?

2 个答案:

答案 0 :(得分:1)

您的复选框的名称将显示为此checkboxs[key here],而ID则会显示为此checkboxs_key_here_。 MVC不知道如何绑定它们。

看看我几天前回答的这个帖子:Generating an MVC3 RadioButton list in a loop statement

同样的事情,只使用RadioButtons而不是CheckBoxes。

答案 1 :(得分:1)

使用编辑器模板

向ViewModel添加一个属性。为了更好的可读性,我将名称从复数更改为单数(选项选项

public class Option
{
    public int OptionId {get; set;}
    public string Option {get; set;}
    public bool IsSelected { set;get;}
}

您的主视图模型,

public class CustomerViewModel
{
  public IEnumerable<Option> OptionList { set;get;}
  public CustomerViewModel()
  {
     OptionList=new List<Option>();
  }
}

Option.cshtml文件夹下创建一个名为Views/YourControllerName的视图。

将此内容包含在内。

@model Option
@{
   Layout = null;
}
<p>
 @Html.CheckBoxFor(x => x.IsSelected)
 @Html.LabelFor(x => x.IsSelected, Model.Option)
 @Html.HiddenFor(x => x.OptionId)
</p>

在主表单中,将其称为

@model YourViewModel
@using(Html.BeginForm())
{     
   @Html.EditorFor(m=>m.OptionList)
  <input type="submit" value="Save" />
}

现在,在您的POST操作中,您可以检查IsSelected属性中项目的OptionList属性值

[HttpPost]
public ActionResult Edit(CustomerViewModel model)
{
   foreach(var opt in model.OptionList)
   {
      //check for model.IsSelected value for each item
   }
}