[英]MVC3 AJAX passing data to controller. It's being submitted twice
所以我有一个表,它使用以下方法转换为数组:
var result = $("#enrolledStudents").sortable('toArray');
但是当我大步前进时,将其传递到我的控制器中,如下所示:
$("#update-enroll").click(function () {
var result = $("#enrolledStudents").sortable('toArray');
$.ajax({
url: '@Url.Action("Enrollment", "Classroom")',
data: { students: result },
type: 'POST',
traditional: true
});
});
我的调试断点被触发两次,导致出现问题。 在POST上向我的控制器提交数据的正确方法是什么?
根据我的评论,可能有几方面的原因。
例
<form action="/somerowout/someaction">
<input type="text" id="text1"/>
<input type="text" id="text1"/>
<input type="submit" />
</form>
如果需要在发布之前验证表单上的值,请不要挂断其他Ajax调用。 您的JavaScript如下所示:
$(document).ready(function () {
$("form").submit(function(){
var result = $("#enrolledStudents").sortable('toArray');
if(result == null){
//do something to show validation failed
return false;
}
return true;
});
});
然后,您的表单代码将类似于:
@using (@Ajax.BeginForm(new AjaxOptions { })) {
<input type="text" id="text1"/>
<input type="text" id="text1"/>
<input type="submit" />
}
如果要使用Ajax而不是HTML Helper,请使用div而不是表单,并且不会收到重复的帖子。 这是实现此目标的方法:
<div id="enrolledStudents">
<--! your elements -->
<button id="saveStudents">Save</button>
</div>
JavaScript的
$(document).ready(function () {
$("saveStudents").click(function(){
var result = $("#enrolledStudents").sortable('toArray');
if(result !== null){ /* do some kind of check here. */
$.ajax({
url: '@Url.Action("Enrollment", "Classroom")',
data: { students: result },
type: 'POST',
traditional: true,
success : function(data) {
if (data.status) {
window.location = data.route;
}
}
})
} else {
/* notify ui that save didn't happpen */
}
});
});
控制器操作示例使用Ajax发布数据时,这是如何传递路线的示例
[HttpPost]
public ActionResult SomethingPost(SomeModel model) {
if (Request.IsAjaxRequest()) {
var json = new {
status = true,
route = @Url.RouteUrl("MyRouteName", new { /* route values */ })
};
return Json(json, JsonRequestBehavior.AllowGet);
}
}
您确定要阻止“提交”按钮的默认行为(表单发布)吗? 使用preventDefault
这样做。
$("#update-enroll").click(function (e) {
e.preventDefault();
//rest of the code
});
编辑:根据评论
要在ajax处理程序中进行重定向,您需要将要在JSON
响应中重定向的URL返回给被调用者。
[HttpPost]
public ActionResult Classroom(string students)
{
//do some operaton
if(Request.IsAjax())
{
//This is an Ajax call
return Json(new
{
Status="Success",
NewUrl = Url.Action("Index","Home")
});
}
else
{
//Normal request. Use RedirectToActiom
return RedirectToAction("Index","Home");
}
}
现在,在您的ajax调用中,检查JSON结果并进行重定向。
$.ajax({
url: '@Url.Action("Enrollment", "Classroom")',
data: { students: result },
type: 'POST',
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (data) {
if(data.Status=="Success")
{
window.location.href = data.Newrl;
}
else
{
alert("some error");
}
}
});
检查是否没有两次加载jquery文件。 我有此行为,问题是文件加载了两次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.