如何获得一个ASP.NET MVC Ajax响应重定向到新的页面,而不是将视成UpdateTarge

2019-07-21 12:02发布

我现在用的是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]
   }

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

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

但家庭控制器索引视图是越来越装入UpdateTargetId,所以我结束了一个页面内的页面。 有两件事情我一直在思考:

  1. 无论是我这个架构错误,应该以不同方式处理这种类型的行动(不使用AJAX)。
  2. 而不是返回重定向的结果,返回其中有JavaScript的它,做在客户端上的重定向的视图。

有没有人对#1意见? 或者,如果#2是一个很好的解决方案,会是什么“的JavaScript重定向观”是什么样子?

Answer 1:

您可以使用JavascriptResult来实现这一目标。

重定向:

return JavaScript("window.location = 'http://www.google.co.uk'");

要重新加载当前页面:

return JavaScript("location.reload(true)");

似乎最简单的选择。



Answer 2:

你可以返回一个JSON URL和改变使用JavaScript在客户端的window.location的。 我喜欢这种方式比调用来自服务器的JavaScript函数,这是我认为它打破的关注点分离。

服务器端:

return Json(new {result = "Redirect", url = Url.Action("ActionName", "ControllerName")});

客户端:

if (response.result == 'Redirect')
    window.location = response.url;

当然,你可以添加更多的逻辑,因为有可能是在服务器端错误,在这种情况下,结果属性可能表明这种情况,并避免重定向。



Answer 3:

你想产生的行为是不是真的使用AJAX最好的做法。 AJAX会,如果你想只更新页面的一部分,不能完全重定向到其他页面被更好地利用。 这违背了AJAX的整个目的真的。

我会建议只是不能与您所描述的行为,使用AJAX。

或者,你可以尝试使用jQuery的阿贾克斯,这将提交申请,然后你的请求完成时指定一个回调。 在回调,你可以决定是否失败或成功,并重定向到成功的另一页。 我发现jQuery的阿贾克斯是更容易使用,特别是因为我已经使用了其他的事情库反正。

你可以找到关于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)


Answer 4:

虽然不优雅,在某些情况下对我的作品。

调节器

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

模型

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

    public string Location { get; set; }

/Views/Shared/JavascriptRedirect.cshtml

@model Models.Shared.JavascriptRedirectModel

<script type="text/javascript">
    window.location = '@Model.Location';
</script>


Answer 5:

使用JavaScript肯定会做的工作。

您还可以使用Content ,如果这是你的风格。

例:

MVC控制器

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

使用Javascript

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


Answer 6:

您可以在阿贾克斯成功简单地写象下面这样:

 $.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");
            }
});


Answer 7:

我需要做的这一点,因为我有一个AJAX登录表单。 当用户成功登录我重定向到一个新的一页,因为其他页面重定向处理回依赖方结束前一个请求(因为它是一个STS SSO系统)。

不过,我也希望它禁用了javascript,是中央登录跳和所有的工作,所以我想出了这个,

    public static string EnsureUrlEndsWithSlash(string url)
    {
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");
        if (!url.EndsWith("/"))
            return string.Concat(url, "/");
        return url;
    }

    public static string GetQueryStringFromArray(KeyValuePair<string, string>[] values)
    {
        Dictionary<string, string> dValues = new Dictionary<string,string>();
        foreach(var pair in values)            
            dValues.Add(pair.Key, pair.Value);            
        var array = (from key in dValues.Keys select string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(dValues[key]))).ToArray();
        return "?" + string.Join("&", array);
    }

    public static void RedirectTo(this HttpRequestBase request, string url, params KeyValuePair<string, string>[] queryParameters)
    {            
        string redirectUrl = string.Concat(EnsureUrlEndsWithSlash(url), GetQueryStringFromArray(queryParameters));
        if (request.IsAjaxRequest())
            HttpContext.Current.Response.Write(string.Format("<script type=\"text/javascript\">window.location='{0}';</script>", redirectUrl));
        else
            HttpContext.Current.Response.Redirect(redirectUrl, true);

    }


Answer 8:

你可以简单地做一些Ajax响应滤波器,用于与$ .ajaxSetup进来的响应。 如果响应包含MVC重定向你可以评估JS侧以此表达。 下面JS示例代码:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data && typeof data == "string") {
            if (data.indexOf('window.location') > -1) {
                eval(data);
            }
        }
        return data;
    }
});

如果数据是:“window.location的=‘/ Acount /登录’”上述过滤器将赶上和评估,使重定向。



Answer 9:

我不是由约瑟夫最佳答案满意,而不是固定正确的问题,他告诉记者,这是错误的用例。 事实上,有例如许多地方,如果您正在转换的旧代码库支持Ajax代码,有你需要它,那么你需要它。 在编程没有任何借口,因为它不仅是你谁是编码其所有不好和良好的开发人员和你必须携手并肩。 所以,如果我在阿贾克斯不编码重定向我的同胞的开发人员可以强迫我有这方面的解决方案。 就像我喜欢用AMD所有图案网站或mvc4,我的公司可以让我远离它一年。

现在让我们在解决方案交谈。

我已经做了AJAX请求和响应处理,我发现是状态代码发送到客户端,并有一个标准的JavaScript功能,了解那些代码最简单的方法的地狱挫折感。 如果我只需发送例如代码13可能意味着重定向。

因此,像{的StatusCode:13,讯息话题:“/首页/登录”} JSON响应当然还有吨提出类似{状态变化:“成功”,代码:13,网址:“/家庭/登录”,消息:‘您已登录现在’}

等等,所以到你自己的标准消息的选择

通常我从基本控制器类继承,并把像这样的标准回复我的选择

public JsonResult JsonDataResult(object data, string optionalMessage = "")
    {
        return Json(new { data = data, status = "success", message = optionalMessage }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonSuccessResult(string message)
    {
        return Json(new { data = "", status = "success", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonErrorResult(string message)
    {
        return Json(new { data = "", status = "error", message = message }, JsonRequestBehavior.AllowGet);
    }

    public JsonResult JsonRawResult(object data)
    {
        return Json(data, JsonRequestBehavior.AllowGet);
    }

关于使用Ajax.BeginForm的$就这一翻译我喜欢使用jQuery Ajax和我做,但同样它不是我的整个世界做出的决定我有一个充满Ajax.BeginForm的应用,当然我没有做到这一点。 但我不得不忍受它。

因此,有一个成功的回调开始表格也一样,你并不需要使用jquery AJAX使用回调一些事情在这里Ajax.BeginForm,呼吁行动,返回JSON,如何访问JSON对象在我的onSuccess JS功能?

谢谢



Answer 10:

如果你是从JavaScript类重定向

相同的视图 - 控制器diferent

<strike>window.location.href = `'Home'`;</strike>

是不是同样的观点

<strike>window.location.href = `'Index/Home'`;</strike>


Answer 11:

添加辅助类:

public static class Redirector {
        public static void RedirectTo(this Controller ct, string action) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action));
        }

        public static void RedirectTo(this Controller ct, string action, string controller) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller));
        }

        public static void RedirectTo(this Controller ct, string action, string controller, object routeValues) {
            UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);

            ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller, routeValues));
        }
    }

然后,在你的行动呼吁:

this.RedirectTo( “指数”, “水泥”);

添加JavaScript代码的任何全局JavaScript包含文件或布局文件拦截所有Ajax请求:

 <script type="text/javascript"> $(function() { $(document).ajaxComplete(function (event, xhr, settings) { var urlHeader = xhr.getResponseHeader('AjaxRedirectURL'); if (urlHeader != null && urlHeader !== undefined) { window.location = xhr.getResponseHeader('AjaxRedirectURL'); } }); }); </script> 



Answer 12:

正如福斯特说,你可以返回的JavaScript和它会将您重定向到所需的页面。

要在当前页面加载页面:

return JavaScript("window.location = 'http://www.google.co.uk'");'

要在新标签页加载:

return JavaScript("window.open('http://www.google.co.uk')");


Answer 13:

您可以通过将这些元刷新标签之一得到一个Ajax调用非基于JS的重定向。 在这里,这似乎是工作: return Content("<meta http-equiv=\"refresh\" content=\"0;URL='" + @Url.Action("Index", "Home") + "'\" />");

注:我发现,元刷新是自动停用火狐,使这不是很有用。



Answer 14:

这个怎么样 :

public ActionResult GetGrid()
{
   string url = "login.html";
   return new HttpStatusCodeResult(System.Net.HttpStatusCode.Redirect,url)
}

然后

$(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
   if (jqxhr.status == 302) {
      location.href = jqxhr.statusText;
   }           
});

要么

error: function (a, b, c) {
       if (a.status == 302) {
         location.href = a.statusText;
       }  
}


文章来源: How to get an ASP.NET MVC Ajax response to redirect to new page instead of inserting view into UpdateTargetId?