希望有人可以指出我正确的方向,整天都在摸我的头,正在开发一个秃头。我花了很多时间在SO上,但我发现的问题似乎与我的确切问题无关。
简而言之,我有一个下拉列表,希望让用户能够实时向列表添加条目。我打算使用AJAX将表单信息发送到控制器,然后将其输入到表中,重新查询,然后作为JSON数组传送回页面,然后我将解析它并替换Select下拉列表中的数据。 / p>
然而,发生的情况是POST请求发生,并且在数据处理期间的某个时刻页面刷新并且数据作为GET请求附加到URL。
AJAX请求:
$(document).on("click", "#save-new-range", function (e) {
e.preventDefault;
var loc = window.location.href;
var url = stripURL('Data/addRange', loc); // Format the target URL correctly
$.post(url, $("#add-range-form").serialize())
.done(function (response) {
debugger;
alert(response);
});
});
StripURL功能(以防万一!)
function stripURL(url, loc) {
var res = "";
if (loc.search("Surveys/New") !== -1) {
res = loc.replace("Surveys/New", "");
} else if (loc.search("Surveys/Amend") !== -1) {
res = loc.replace("Surveys/Amend", "");
} else if (loc.search("Surveys/") !== -1) {
res = loc.replace("Surveys/Amend", "");
}
if (res.search("#") !== -1) {
res = res.replace("#", "");
}
url = res + url;
return url;
}
Controller(没有查询和插入):
[HttpPost]
public JsonResult addRange(FormCollection fc)
{
{
... Do data processing and query data into a dictionary called res ...
}
return Json(res);
}
调试,处理我的控制器操作并使用正确的数据填充res,但由于重定向,永远不会输入.done()函数。
很高兴发布完整的控制器,但为了简洁起见,已将其删除。如果你想看到它,请告诉我。
答案 0 :(得分:2)
您正在使用e.preventDefault
而不将其作为函数调用。这不会运行。这就是为什么return false;
在接受的答案中起作用的原因。使用e.preventDefault()
作为函数调用不需要return false;
。
$(document).on("click", "#save-new-range", function (e) {
// called as a function
e.preventDefault();
var loc = window.location.href;
var url = stripURL('Data/addRange', loc); // Format the target URL correctly
$.post(url, $("#add-range-form").serialize())
.done(function (response) {
debugger;
alert(response);
});
});
你可以在SO的控制台中测试这个:
$('a').click(function(e){
e.preventDefault();
});
这将停止任何a
标记的默认行为。如果省略函数调用,它什么都不做。
答案 1 :(得分:1)
$(document).on("click", "#save-new-range", function (e) {
e.preventDefault;
var loc = window.location.href;
var url = stripURL('Data/addRange', loc); // Format the target URL correctly
$.post(url, $("#add-range-form").serialize())
.done(function (response) {
debugger;
alert(response);
});
return false;
});
看看这是否有效。