复选框状态始终作为 null 传递给控制器
本文关键字:控制器 null 状态 复选框 | 更新日期: 2023-09-27 18:19:03
类似的问题已经问了几次,但我似乎找不到答案。
我正在向控制器操作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">×</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
?
绑定
将检查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")
如果你做一些改变,我认为你会取得更大的成功。但是,如果您希望控制器操作具有许多参数而不是单个视图模型,则可能不喜欢我的解决方案。
-
创建一个复杂的视图模型,而不是有几个松散的参数。随着时间的推移,这往往更容易维护。
public class Note { public string Comment {get;set;} public DateTime? AlertDate { get; set; } public bool Complete { get; set; } public string AssignedTo { get; set; } }
-
更改操作以采用新视图模型
[HttpPost] public void AddNote(Note viewModel) { // Unrelated Code }
-
在 CSHTML 中设置@model
@model Company.Product.Note
虽然Html.CheckBoxFor(x => x.Complete)
是首选方法,但您仍然可以手动执行等效的 HTML。但是,如果视图模型发生更改,由于名称不匹配,Html.CheckBoxFor
会给您一个更有意义的错误。
哼!