2016-04-23 3 views
3

Я пытаюсь выяснить, почему мой запрос POST AJAX отображается как null, когда он попадает на сторону контроллера. Я пробовал много вариантов, но ниже это то, что у меня есть сейчас.Запрос MVC AJAX POST отображается как null в контроллере

Сейчас я только пытаюсь получить вопрос с типом, чтобы пройти, поэтому большая часть модели не нужна и может быть нулевой.

Что для меня очень странно, так это то, что я не только вижу, что данные являются информацией о запросе с помощью инструментов отладки Chrome, но работает очень похожий метод (хотя в модели нет списков. области сайта, я использовал эту модель для представления, и она работает.

Кроме того, это не просто AJAX, я пытался просто делать регулярно представлять, и он делает то же самое.

Ниже я считаю, что это интересно. Дайте мне знать, если что-то еще необходимо.

Обновления из чата:

Тип QuestionType является перечислением, и значения 0-2 действительны для него.

Я пробовал использовать jQuery, в том числе используя метод serialize(), показанный here. Это ничего не делало.

Я подтвердил, что отправляется, это первый с нормальной подачей, а второй - при использовании jQuery.

"QuestionID = -1 & Вопрос = ли + вы + живой" % "3F & Type = 0"


«QuestionID = -1 & Вопрос = ли + вы + живы% 3F & Type = 0"

Модель

public class QuestionnaireViewModel 
{ 

    [Required] 
    public QuestionType Type { get; set; } 

    public int QuestionID { get; set; } 

    [Required] 
    public string Question { get; set; } 

    public string RadioOption { get; set; } 

    public List<string> Options { get; set; } 

    public List<bool> MC_Answers { get; set; } 

    public string ShortAnswer { get; set; } 
} 

HTML

<form action="/Staffing/SaveQuestion" class="form-horizontal" method="post" role="form"> 
    <input data-val="true" data-val-number="The field QuestionID must be a number." data-val-required="The QuestionID field is required." id="QuestionID" name="QuestionID" type="hidden" value="5"> 
    <div class="form-group"> 
     <label for="Question">Question</label> 
     <input class="form-control editDisplayText" data-val="true" data-val-required="The Question field is required." id="Question" name="Question" type="text" value=""> 
     <span class="field-validation-valid text-danger" data-valmsg-for="Question" data-valmsg-replace="true"></span> 
    </div> 
    <div class="form-group"> 
     <label class="control-label col-md-2" for="Type">Type</label> 
     <div class="col-md-10"> 
      <select class="form-control questionTypeDD" data-val="true" data-val-required="The Type field is required." id="Type" name="Type"> 
       <option selected="selected" value="0">SHORT</option> 
       <option value="1">RADIO</option> 
       <option value="2">CHECKBOX</option> 
      </select> 
     </div> 
     <span class="field-validation-valid text-danger" data-valmsg-for="Type" data-valmsg-replace="true"></span> 
    </div> 
    <div class="form-group"> 
     <div class="col-md-12"> 
      <input type="submit" value="Save Edits" class="btn btn-default pull-right"> 
     </div> 
    </div> 
</form> 

AJAX

function submitQuestion(event) { 
    event.preventDefault(); 
    var radio, checkbox; 

    var xmlhttp = new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 

      if (xmlhttp.responseText.indexOf("Success") >= 0) { 
       restoreEdit(); 

       var currentJob = document.getElementById('currentJob'); 
       if (currentJob != null && currentJob != undefined) { 
        clearQuestions(); 
        getJobQuestionsById(currentJob.innerHTML); 
        addQuestionEventHandlers(); 
       } 
       else { 
        alert("Question added successfully"); 
       } 
      } 
      else { 
       alert(xmlhttp.responseText); 
      } 
     } 
    } 

    var form = event.currentTarget; 
    var formData = new FormData(form); 
    xmlhttp.open("POST", form.action, false); 
    xmlhttp.send(formData); 
} 

HTTP Request

завиток "http://localhost:49345/Staffing/SaveQuestion" -H "Происхождение: http://localhost:49345" -H «Accept-Encoding : gzip, deflate "-H" Accept-Language: en-US, en; q = 0.8 "-H" User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, как и Gecko) Chrome/49.0.2623.112 Safari/537.36 "-H" Content-Type: multipart/form-data; border = ---- WebKitFormBoundaryU4mNITZXngk0WZ8C "-H" Принять: / "-H" Referer: http://localhost:49345/Staffing/Dashboard "-H" Подключение: keep-alive "-H" DNT: 1 "--data-binary" ---- --WebKitFormBoundaryU4mNITZXngk0WZ8C "^ " Content-Disposition: form-data; Название = "" QuestionID "" "^

"-1"^ "------ WebKitFormBoundaryU4mNITZXngk0WZ8C"^ " Content-Disposition: форм-данных; имя = "" Вопрос "" "^

"Вы живы?"^ "------ WebKitFormBoundaryU4mNITZXngk0WZ8C"^ " Content-Disposition: форм-данных; имя = "" Тип "" "^

"0"^ "------ WebKitFormBoundaryU4mNITZXngk0WZ8C -"^ "" --compressed

+0

, который вызывает функцию submitQuestion. –

+0

Другая страница, чем сама. На той же странице, которая вызывает другую аналогичную страницу. – David

+0

ОК. что такое тело запроса, которое передается из инструментов разработчика. –

ответ

1

Я наконец нашел решение поблагодарить этого Начать Model is null when form submitted

Мой контроллер был такой:

public ActionResult SaveQuestion(QuestionnaireViewModel question) 

Который, видимо, была проблема из-за этого (даже с другом корпусе):

public string Question { get; set; } 

Раствор был такой:

public ActionResult SaveQuestion(QuestionnaireViewModel postQuestion) 

В основном, название объекта принимается не может быть таким же, как имя одного из свойств, или по-видимому MVC выкрутасы.

+1

Hardcore. Я ожидал бы, по крайней мере, Исключения вроде «Не могу привязываться через привязку к модели из-за неоднозначных имен ...» –