通过javascript发布到控制器的不同行为比直接从提交按钮发布

时间:2016-01-25 17:21:33

标签: javascript jquery asp.net-mvc

我有一个表格中的这个按钮:

<button id="save" type="submit" formaction="@Url.Action("SaveEvent")" formmethod="post">Save</button>

该控制器的哪些帖子:

public async Task<ActionResult> SaveEventAsync(EventDataModel vm)
{
    // save to db etc...
    TempData["Saved"] = true;
    return RedirectToActionWithReturnUrl("EventDetail", new { eventId = vm.EventId });
}

这会将我重定向到详细信息页面。但是,如果我然后添加这个JS函数来做帖子,我不会被重定向,也不会在TempData中看到值。

$('#save').click(function(e){
    e.preventDefault();
    $.post( "SaveEvent", {
        EventID: "@Model.EventId",
        SomeValue: 123
    });
}

我尝试在JS函数中重定向,但它没有返回新保存的值:

window.location = '@Html.Raw(@Url.Action("EventDetail", new { eventId = @Model.EventId}))';

有人可以解释为什么从JS发布时控制器中的重定向不起作用吗?

1 个答案:

答案 0 :(得分:0)

控制器中的重定向相关方法(RedirectRedirectToAction)返回302响应,新的url将重定向为{{1标题和浏览器通常会发出新的GET请求。

您不应该调用一个从ajax调用返回302响应的action方法。相反,您应该向正在发出请求的ajax调用返回一个json响应。

location

并在您的public async Task<ActionResult> SaveEventAsync(EventDataModel vm) { // save to db etc... return Json(new {status = "success"}); } 方法回调中,检查响应并执行重定向。

$.post

我更新了您的代码,以使用Url.Action方法为操作方法构建正确的相对URL。如果您的javascript代码位于单独的js文件中,请在您的剃刀页面中构建基本网址,并按照此post中的说明传递给您的js代码。