2015-10-23 2 views
3

Похожие вопросы задавали пару раз, но я не могу найти ответ.Состояние флажка всегда передается контроллеру как null

Я POST Выполняю некоторые значения для действия контроллера, и все параметры успешно передаются исходя из их имен, за исключением значения bool моего флажка. Он всегда передается как 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?

+0

Я прокомментирую это, потому что я не знаю, если это хороший ответ, но однажды это случилось со мной, казалось, что отправитель Ajax не установлен как классический, поэтому по какой-то причине он не понимает, как сопоставить флажок, я установил значение с помощью JavaScript и использовал запрос JQuery Ajax вместо предоставленного Microsoft. Это просто обходной путь, потому что я не знаю, почему это происходит, попробуйте создать этот флажок с помощью CheckBoxFor(); Вы также можете попытаться получить значение checkbox как строку на вашем контроллере. Надеюсь, это сработает для вас. – darkndream

+0

Спасибо за ваш вклад, и да, я думал просто переключиться на jQuery ajax – cfly24

+2

Хорошо работает с jQuery ajax ... отвлекает Microsoft ajax для хорошего – cfly24

ответ

2

Обязательная проверка проверяется на наличие value attribute, так как их нет в вашем checkbox всегда будет false. Один из способов, вы можете сделать, это явно получить complete от вашего FormCollection текущего запроса, как следующее:

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")

0

Если вы внесете несколько изменений, я думаю, что у вас будет больше успеха. Однако, если вы предпочитаете, чтобы у вашего контроллера было много аргументов вместо одной модели просмотра, вам может не понравиться мое решение.

  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. Установите @model в CSHTML

    @model Company.Product.Note 
    

Хотя Html.CheckBoxFor(x => x.Complete) подход является предпочтительным, вы можете все еще делают эквивалентный HTML вручную. Однако, если viewmodel вообще изменится, Html.CheckBoxFor даст вам более значимую ошибку из-за несоответствий имени.

HTH!

Смежные вопросы