如何获取ASP.NET MVC Ajax响应重定向到新页面而不是将视图插入UpdateTargetId?

Jef*_*mer 83 c# ajax asp.net-mvc asp.net-mvc-ajax

我正在使用Ajax.BeginForm来创建一个表单,它将ajax回发到某个控制器操作,然后如果操作成功,用户应该被重定向到另一个页面(如果操作失败,那么将显示一个状态消息AjaxOptions UpdateTargetId).

using (Ajax.BeginForm("Delete", null,
        new { userId = Model.UserId },
        new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
        new { name = "DeleteForm", id = "DeleteForm" }))
   {
    [HTML DELETE BUTTON]
   }
Run Code Online (Sandbox Code Playgroud)

如果删除成功,我将返回重定向结果:

[Authorize]
public ActionResult Delete(Int32 UserId)
{
    UserRepository.DeleteUser(UserId);
    return Redirect(Url.Action("Index", "Home"));
}
Run Code Online (Sandbox Code Playgroud)

但是Home Controller Index视图已加载到UpdateTargetId中,因此我最终得到了页面中的页面.我正在考虑的两件事:

  1. 要么我正在设计这个错误,应该以不同的方式处理这种类型的操作(不使用ajax).
  2. 而不是返回Redirect结果,返回一个视图,其中包含javascript,在客户端进行重定向.

有人对#1发表评论吗?或者,如果#2是一个很好的解决方案,那么"重定向javascript视图"会是什么样子?

Ben*_*ter 168

你可以用它JavascriptResult来实现这一目标.

重定向:

return JavaScript("window.location = 'http://www.google.co.uk'");
Run Code Online (Sandbox Code Playgroud)

要重新加载当前页面:

return JavaScript("location.reload(true)");
Run Code Online (Sandbox Code Playgroud)

似乎是最简单的选择.

  • 如果要重定向到项目中的控制器,可以使用Url帮助程序.例如:`return JavaScript("window.location ='"+ Url.Action("Edit","Dispatch")+"'");` (29认同)
  • 太棒了..帮帮我了. (4认同)
  • 短.简单.优秀.大! (2认同)

Fra*_*ein 25

您可以使用URL返回JSON,并在客户端使用JavaScript更改window.location.我更喜欢这种方式,而不是从服务器调用JavaScript函数,我认为它打破了关注点的分离.

服务器端:

return Json(new {result = "Redirect", url = Url.Action("ActionName", "ControllerName")});
Run Code Online (Sandbox Code Playgroud)

客户端:

if (response.result == 'Redirect')
    window.location = response.url;
Run Code Online (Sandbox Code Playgroud)

当然,您可以添加更多逻辑,因为服务器端可能存在错误,在这种情况下,result属性可以指示这种情况并避免重定向.


Jos*_*eph 12

您尝试生成的行为并不是最好使用AJAX完成的.如果您只想更新页面的一部分,而不是完全重定向到其他页面,则最好使用AJAX.这真的打败了AJAX的整个目的.

我建议不要将AJAX与你描述的行为一起使用.

或者,您可以尝试使用jquery Ajax,它将提交请求,然后在请求完成时指定回调.在回调中,您可以确定它是失败还是成功,并在成功时重定向到另一个页面.我发现jquery Ajax更容易使用,特别是因为我已经将这个库用于其他东西了.

你可以在这里找到关于jquery ajax的文档,但语法如下:

jQuery.ajax( options )  

jQuery.get( url, data, callback, type)

jQuery.getJSON( url, data, callback )

jQuery.getScript( url, callback )

jQuery.post( url, data, callback, type)
Run Code Online (Sandbox Code Playgroud)


Val*_*mas 12

虽然不优雅,但在某些情况下适合我.

调节器

if (RedirectToPage)
    return PartialView("JavascriptRedirect", new JavascriptRedirectModel("http://www.google.com"));
else
   ... return regular ajax partialview
Run Code Online (Sandbox Code Playgroud)

模型

    public JavascriptRedirectModel(string location)
    {
        Location = location;
    }

    public string Location { get; set; }
Run Code Online (Sandbox Code Playgroud)

/Views/Shared/JavascriptRedirect.cshtml

@model Models.Shared.JavascriptRedirectModel

<script type="text/javascript">
    window.location = '@Model.Location';
</script>
Run Code Online (Sandbox Code Playgroud)

  • 为什么不优雅?它是强类型的,而且感觉很清晰。我喜欢这种方法。+1 (2认同)

chr*_*989 5

使用JavaScript肯定会完成这项工作.

Content如果这更符合您的风格,您也可以使用.

例:

MVC控制器

[HttpPost]
public ActionResult AjaxMethod()
{
    return Content(@"http://www.google.co.uk");
}
Run Code Online (Sandbox Code Playgroud)

使用Javascript

$.ajax({
    type: 'POST',
    url: '/AjaxMethod',
    success: function (redirect) {
        window.location = redirect;
    }
});
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以简单地在 Ajax Success 中编写,如下所示:

 $.ajax({
            type: "POST",
            url: '@Url.Action("GetUserList", "User")',
            data: { id: $("#UID").val() },
            success: function (data) {
                window.location.href = '@Url.Action("Dashboard", "User")';
            },
            error: function () {
                $("#loader").fadeOut("slow");
            }
});
Run Code Online (Sandbox Code Playgroud)