【发布时间】:2016-08-17 05:28:48
【问题描述】:
我试图弄清楚为什么我的 AJAX POST 请求在到达控制器端时显示为null。我尝试了很多变体,但以下是我现在所拥有的。
现在我只是想让一个带有类型的问题通过,所以大部分模型都不需要,可以为空。
对我来说最奇怪的是,我不仅可以使用 Chrome 的调试工具看到数据是请求信息,而且还有一种非常相似的方法正在起作用(尽管模型中没有列表。此外,它的其他区域该网站的,我使用该模型进行提交,并且它有效。
另外,它不只是 AJAX,我试过只做一个常规提交,它做同样的事情。
我相信下面是所有有趣的东西。让我知道是否需要其他东西。
聊天更新:
QuestionType 类型是一个枚举,值 0-2 对其有效。
我尝试过使用 jQuery,包括使用here 中显示的 serialize() 方法。这没有任何作用。
我已经确认发送的是什么,第一个是正常提交的,第二个是使用jQuery的。
"QuestionID=-1&Question=Are+you+alive"%"3F&Type=0"
“QuestionID=-1&Question=Are+you+alive%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 请求
curl "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, like Gecko) Chrome/49.0.2623.112 Safari/537.36" -H "Content-Type: multipart/form-data;boundary=---- WebKitFormBoundaryU4mNITZXngk0WZ8C" -H "接受:/" -H "引用者:http://localhost:49345/Staffing/Dashboard" -H "连接:保持活动状态" -H "DNT: 1" --data-binary "--- ---WebKitFormBoundaryU4mNITZXngk0WZ8C"^ “内容处置:表单数据;name=""QuestionID"""^
“-1”^ "-----WebKitFormBoundaryU4mNITZXngk0WZ8C"^ "内容-处置:表单-数据;name=""问题"""^
“你还活着吗?”^ "-----WebKitFormBoundaryU4mNITZXngk0WZ8C"^ "内容配置:表单数据;名称=""类型"""^
“0”^ "-----WebKitFormBoundaryU4mNITZXngk0WZ8C--"^ "" --压缩的
【问题讨论】:
-
谁在调用 submitQuestion 函数。
-
与自身不同的页面。调用另一个相似页面的同一页面。
-
好的。从开发人员工具中捕获的请求正文是什么。
-
由于您的 viewmodel 类具有其他复杂类型,因此无法将表单数据转换回复杂类型。在这种情况下,填充 QuestionID 和 Question 属性,但不会填充 QuestionType 类型的 Type。所以最好的方法是从客户端发送相应的 json 数据。然后 modelbinder 甚至为复杂类型填充。
-
请求正文已经在帖子中,猜你看到了。那么,它不起作用的原因是因为它要转到另一个页面,还是因为它具有复杂的类型?所以,我只需要发送 JSON,而不是发送 URL 编码形式,它会工作吗?如果你有这方面的教程,那会很有帮助。
标签: javascript ajax asp.net-mvc post