我有一个表格中的这个按钮:
<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发布时控制器中的重定向不起作用吗?
答案 0 :(得分:0)
控制器中的重定向相关方法(Redirect
,RedirectToAction
等)返回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代码。