首页 文章

处理MVC 4中的复选框值

提问于
浏览
0

我的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 回答

  • 4

    这里有两个问题:

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

    其次,他们需要一个 Value . 这比较复杂,并且是复选框的一个古老问题 . 默认情况下,如果选中了复选框,浏览器将提交与复选框关联的值,如果未选中,则不会提交任何内容 . 因此,为了使复选框在选中时提交 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) {
        // ...
    }
    
  • 3

    表单输入不会在 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
     }
    

相关问题