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

Posted

技术标签:

【中文标题】MVC3 将字典 <string,bool> 从视图传递到控制器【英文标题】:MVC3 Passing dictionary<string,bool> from view to controller 【发布时间】:2012-08-09 03:26:28 【问题描述】:

我需要在表单上显示几个复选框,用户可以随意检查。

所以我将复选框选项存储在数据库中。 (必填)

型号

public class Options

    public int OptionsId get; set;
    public string Option get; set;

在视图模型上,

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

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

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

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

知道为什么吗?

【问题讨论】:

对不起,我无法理解:视图显示正确,但是当您发布它时,您丢失了复选框值? 是的,我在 foreach 循环创建的视图上有 3 个复选框。因此,如果我选中两个框并发布到控制器。当我检查控制器上的复选框变量时,它为空。(根本没有)基本上我希望控制器像这样获得它 checkboxs[Option1] = true, checkboxs[Option2] = false , checkboxs[Option3] = true。取决于用户检查的复选框。我相信,它与我如何格式化 html 有关,所以我认为它与为复选框生成 html 的 foreach 循环有关。 【参考方案1】:

您的复选框将被命名为checkboxs[key here],ID 为checkboxs_key_here_。 MVC 不知道如何将这些绑定回来。

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

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

【讨论】:

单选按钮不允许多选。【参考方案2】:

使用编辑器模板

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

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>();
  

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

里面有这个内容。

@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 操作中,您可以检查OptionList 属性中项目的IsSelected 属性值

[HttpPost]
public ActionResult Edit(CustomerViewModel model)

   foreach(var opt in model.OptionList)
   
      //check for model.IsSelected value for each item
   

【讨论】:

以上是关于MVC3 将字典 <string,bool> 从视图传递到控制器的主要内容,如果未能解决你的问题,请参考以下文章

MVC 3 多表单模型传递到字典

使用 AnyObject 时 Bool 被视为 int

ios开发 怎么将bool值放入字典

参数类型“void Function(Map<String, bool>)”不能分配给参数类型“Map<String, bool>”

如何制作一个包含特定值的Swift词典?

为啥不能使用 null 作为 Dictionary<bool?, string> 的键?