【问题标题】:CheckBox lists in ASP.NET MVC and bind it back to controllerASP.NET MVC 中的 CheckBox 列表并将其绑定回控制器
【发布时间】:2015-12-30 01:06:19
【问题描述】:
 Html.CheckBox("SelectedStudents", false, new { @class = "check-item", id = x.Id, value = x.Id })

生产的

<input checked="checked" class="check-item" id="4507" name="SelectedStudents" value="4507" type="checkbox">

<input checked="checked" class="check-item" id="4507" name="SelectedStudents" value="4508" type="checkbox">

<input checked="checked" class="check-item" id="4507" name="SelectedStudents" value="4509" type="checkbox">

在 mvc 模型中我有

public IEnumerable<string> SelectedStudents { get; set; }

但是当我回帖时,SelectedStudents 始终为空。为什么? 在这个方法中http://benfoster.io/blog/checkbox-lists-in-aspnet-mvc 是这样写的:

ASP.NET MVC 模型绑定器足够智能,可以映射所选项目 到这个属性。

但在我的示例中始终为空。为什么?如何编写更多的复选框并将其绑定回来

【问题讨论】:

  • 因为您发布的博客使用的是强类型编辑器(强类型编辑器以 For 结尾,如 CheckListBoxFor),而您将其更改为使用哑编辑器 (@987654326 @)。只要您确切地知道自己在做什么,愚蠢的编辑器就可以被模型绑定。

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


【解决方案1】:

您应该使用强类型编辑器才能将结果传递给控制器​​(模型绑定器)。

我更喜欢这样做。

型号

public class YourViewModel
{
     public List<SelectListItem> Students
        {
            get;
            set;
        }
}

控制器获取

Students= service.GetStudents(); //Fill the list

查看

  @for (var i = 0; i < Model.Students.Count; i++)
                {

                    @Html.CheckBoxFor(m => m.Students[i].Selected)
                    @Html.HiddenFor(m => m.Students[i].Text)
                    @Html.HiddenFor(m => m.Students[i].Value)
                    <span>@Model.Students[i].Text</span>
                }

控制岗位

[HttpPost]
        public ActionResult Create(YourViewModel model)
        {
          foreach(var student in model.Students)
          {
            if(student.Selected) { // Do your logic}
          }
        }

或者 您可以使用数组或字符串列表。 本例中使用了 ListBox。

public string[] SelectedStudents{ get; set; }

@Html.ListBoxFor(s => s.SelectedStudents, new MultiSelectList(Model.Students, "Value", "Text", Model.SelectedStudents), new { @class = "form-control", style = "height:250px; width:100%" })

【讨论】:

    【解决方案2】:

    在这里查看我的答案How to bind checkbox values to a list of ints?

    这样做的好处是它很好地分离了控制器和用户界面之间的关注点。 html 扩展方法还使用复选框的标签和输入创建正确的 html。并且不需要隐藏字段。

    【讨论】:

      【解决方案3】:

      你用 CheckBoxListFor 试试吗?您需要将复选框与模型相关联,并且不应具有相同的 ID 和名称

      @Html.CheckBoxListFor(model => model.SelectedSources, Model.SubscriptionSources)
      

      【讨论】:

        【解决方案4】:

        您需要使用可变类型,例如List&lt;string&gt;

        public List<string> SelectedStudents { get; set; }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-13
          • 2012-05-19
          • 2013-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多