繁体   English   中英

复选框状态始终作为null传递给控制器

[英]Checkbox state always passed to controller as null

类似的问题已被问过几次,但我似乎无法找到答案。

POST荷兰国际集团一些值到控制器的动作,所有的参数都被成功地通过基于了他们的名字,但我的复选框的布尔值。 它始终作为null传递。

形成:

@using (Ajax.BeginForm("AddNote", "Home", FormMethod.Post, new AjaxOptions { OnSuccess = "function noteAdded();", OnFailure = "alert(xhr.responseText)" }))
{
    <!-- New Note Modal -->
    <div class="modal fade" id="note-add-modal" tabindex="-1" role="dialog" aria-labelledby="note-add-modal">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="note-add-modal-Label">Add A Note</h4>
                </div>

              <div class="modal-body">
                  <textarea placeholder="Description..." class="form-control" rows="5" id="comment" name="comment"></textarea>
                  <textarea name="assignTo" id="assign-to" rows="1" class="form-control" placeholder="Assign To..." data-autocomplete-url="@Url.Action("AutoCompleteUsername")"></textarea>
                  <br/>
                  <label id="follow-up-date">Follow-Up Date: <input name="alertDate" class="form-control-date" placeholder="dd/mm/yyyy" id="datepicker" type="text" /></label>
                  <label class="complete-label">Complete:</label>
                  <input type="checkbox" id="complete" name="complete" checked="checked"/>
                  <label for="complete"></label>
              </div>
              <div class="modal-footer">
                  <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                  <button type="submit" id="note-form-submit" class="btn btn-primary">Save changes</button>
              </div>

            </div>
        </div>
    </div>

}

该复选框的名称为: complete

控制器动作:

[HttpPost]
public void AddNote(string comment, DateTime? alertDate, bool complete, string assignedTo)
    {
        // Unrelated Code
    }

我以为你能够通过名称将复选框状态作为bool值传递给控制器​​。 或者绝对有必要使用@Html.Checkbox

绑定将检查value attribute因为您的checkbox没有任何value attribute ,它将始终为false 您可以采取的一种方法是从当前请求的FormCollection中明确地获取complete ,如下所示:

public void Submit(bool test)
{
    var complete = Request.Form["complete"];
    //complete == null if checkbox was not checked
    //complete == "on" if checkbox was checked
}

另一种更简单的方法是使用@Html.Checkbox("complete")

如果你做了一些改变,我想你会取得更大的成功。 但是,如果您希望控制器操作具有多个参数而不是单个视图模型,则可能不喜欢我的解决方案。

  1. 创建一个复杂的视图模型,而不是有几个松散的参数。 随着时间的推移,这往往更容易维护。

     public class Note { public string Comment {get;set;} public DateTime? AlertDate { get; set; } public bool Complete { get; set; } public string AssignedTo { get; set; } } 
  2. 更改您的操作以采用新的viewmodel

     [HttpPost] public void AddNote(Note viewModel) { // Unrelated Code } 
  3. 在CSHTML中设置@model

     @model Company.Product.Note 

虽然Html.CheckBoxFor(x => x.Complete)是首选方法,但您仍可以手动执行等效的HTML。 但是,如果视图模型完全改变,由于名称不匹配, Html.CheckBoxFor将为您提供更有意义的错误。

HTH!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM