【问题标题】:Checkbox state always passed to controller as null复选框状态始终作为 null 传递给控制器
【发布时间】:2016-01-23 07:18:50
【问题描述】:

类似的问题已经问过几次了,但我似乎找不到答案。

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
    }

我认为您可以通过名称将复选框状态作为布尔值传递给控制器​​。还是绝对有必要使用@Html.Checkbox

【问题讨论】:

  • 我会评论这个,因为我不知道这是否是一个好的答案,但它发生在我身上一次,似乎是 Ajax 发件人没有被某些人设置为经典的事实因为它不了解如何映射复选框,所以我确实使用 JavaScript 设置了值,并使用了 Jquery Ajax 请求而不是 Microsoft 提供的请求。这只是一种解决方法,因为我不知道为什么会发生这种情况,请尝试使用 CheckBoxFor() 创建该复选框;您还可以尝试在控制器上将复选框值作为字符串获取。希望它对你有用。
  • 感谢您的意见,是的,我正在考虑切换到 jQuery ajax
  • 与 jQuery ajax 一起工作得很好......永远放弃 Microsoft ajax
  • 将 value="true" 添加到您的输入中 ..&lt;input type="checkbox" id="complete" name="complete" value="true" checked /&gt;
  • 另请参阅this answer

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


【解决方案1】:

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

  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. 更改您的操作以采用新的视图模型

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

    @model Company.Product.Note
    

虽然Html.CheckBoxFor(x =&gt; x.Complete) 是首选方法,但您仍然可以手动执行等效的 HTML。但是,如果视图模型发生了变化,Html.CheckBoxFor 会由于名称不匹配而给您一个更有意义的错误。

HTH!

【讨论】:

    【解决方案2】:

    绑定将检查value attribute,因为您的checkbox 中没有任何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")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2018-12-15
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多