处理MVC 4中的复选框值

时间:2014-11-13 14:46:07

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

我的MVC视图中的表单内有一个复选框,如下所示:

<div class="row" style="width: 98%;">
  <div class="col-md-1" style="width: 22%;">Active</div>
  <div class="col-md-1" style="width: 23%;">
    <input type="checkbox" ID="chb_Active" style="color: #428bca;">
  </div>
  <div class="col-md-1" style="width: 22%;">Inactive</div>
  <div class="col-md-1" style="width: 23%;">
    <input type="checkbox" ID="chb_Inactive" style="color: #428bca;">
  </div>
  <div class="col-md-1" style="width: 20%;"></div>                          
</div>

在我的控制器上,ActionResult方法如下所示。

public ActionResult MethodName(string submit, FormCollection collection) 
{
  bool chb_Active = Convert.ToBoolean(collection["chb_Active"]);
  bool chb_Inactive = Convert.ToBoolean(collection["chb_Inactive"]);
  //Some other operations
  //The return view
}

这就是我处理所有其他控件(如下拉列表)的方法,它可以正常工作并获取所选值。

问题出现在复选框值上,即使您检查或取消选中它们,它们也始终设置为False,它们总是返回False。

我是MVC的新手,请帮助或指出正确的方向。我试过没有FormCollection,但仍然没有形成积极的结果。

与此相关的大多数档案在这种情况下没有帮助,因为它们的复选框中包含值。

2 个答案:

答案 0 :(得分:4)

id属性不会选择表单输入,而是name属性。

将输入更改为:

<input type="checkbox" name="chb_Active" ...

将允许将数据发布回控制器。您还应根据Ben Griffiths' answer添加value属性和隐藏输入。


更好的方法

更多MVC-y方法是使用View Models。

创建一个文件夹/ViewModels/ControllerName并在其中放置一个类(它实际上不必在此文件夹中,但是遵循惯例后跟视图很好):

public class MethodNameViewModel
{
    public bool Active { get; set; }
    public bool Inactive { get; set; }
}

在视图中,您现在可以

@model ProjectName.ViewModels.ControllerName.MethodNameViewModel

<div class="row" style="width: 98%;">
    <div class="col-md-1" style="width: 22%;">
        @Html.DisplayNameFor(x => x.Active)
    </div>
    <div class="col-md-1" style="width: 23%;">
        @Html.EditorFor(x => x.Active, new { style = "color: #428bca" })
    </div>

    @* Same for other field *@

然后您的帖子操作变为:

[HttpPost]
public ActionResult MethodName(MethodNameViewModel methodNameViewModel) 
{
    var active = methodNameViewModel.Active;
    var inactive = methodNameViewModel.Inactive

    // ... etc
 }

答案 1 :(得分:3)

这里有两个问题:

首先,您的HTML输入需要name属性 - 而不仅仅是id - 因为它是用作表单集合中键的名称。

其次,他们需要一个价值。这比较复杂,并且是复选框的一个古老问题。默认情况下,如果选中了复选框,浏览器将提交与复选框关联的值,如果未选中,则不会提交任何内容。因此,为了在复选框中提交true复选框,并在未选中时false,您需要执行以下操作:

<input type="checkbox" ID="chb_Active" name="chb_Active" value="true" style="color: #428bca;">
<input type="hidden" name="chb_Active" value="false">

(类似于你的另一个复选框,如果你想要其中两个)。

如果未选中此复选框,则使用此设置,false将作为表单的chb_Active属性的值发回。如果 被选中,则falsetrue都将被回发,如果您使用其模型,ASP.NET将自动为您选择true绑定功能,如下所示:

public ActionResult MethodName(string submit, bool chb_Active) {
    // ...
}