MVC AJAX POST请求重定向到原始页面为GET

时间:2015-09-16 15:32:47

标签: c# json ajax post model-view-controller

希望有人可以指出我正确的方向,整天都在摸我的头,正在开发一个秃头。我花了很多时间在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()函数。

很高兴发布完整的控制器,但为了简洁起见,已将其删除。如果你想看到它,请告诉我。

2 个答案:

答案 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;
});

看看这是否有效。