2010-02-13 33 views
1

當例如發生某種異常或授權失敗時,我想重定向到操作方法中的另一個頁面。這對於普通請求不是問題,但是當通過Ajax發出請求時,重定向失敗。 許多人似乎建議我應該送回JavaScriptResult並更改document.location,但我不確定這是否是最佳解決方案。有沒有其他方法可以實現這一目標?謝謝。如何在發出Ajax請求時在ASP.MVC中重定向?

P.S.我正在使用ASP.NET MVC v1.0。

+0

你是否想讓請求改變的頁面?或您的AJAX請求的目的地?如果你在瀏覽器中改變下面的答案是一種方式。 – 2010-02-13 22:13:49

回答

3

通過AJAX做「重定向」的唯一方法是使用javascript,無論您是否使用在JSON中設置位置或新URL的腳本傳回JavaScriptResult,並在回調處理程序中設置位置。我認爲這個選擇實際上取決於你如何處理請求的結果。如果它總是要重定向,那麼我只需要在沒有AJAX的情況下發出請求。如果通常情況下,您會返回放在頁面上的HTML,那麼JavaScriptResult可能會更好。如果您通常獲取JSON並通過代碼更新頁面,那麼我會發回一個包含URL的JSON響應,並讓回調處理程序設置位置。

+0

謝謝。 JavaScriptResult選項似乎是一種破解,因此我將使用JSON選項,它看起來更清晰。 – Zoman 2010-02-13 23:52:51

5

我試圖做同樣的事情,這個網址對我來說是一個很大的幫助。我稍微修改了它,以便它可以與RedirectResult以及Redirect一起使用。

http://craftycodeblog.com/2010/05/15/asp-net-mvc-ajax-redirect/

只要有你所有的控制器,從這個基地控制器繼承。

public abstract class MyBaseController : Controller { 

      protected override RedirectToRouteResult RedirectToRoute(string routeName, System.Web.Routing.RouteValueDictionary routeValues) { 
       return new AjaxAwareRedirectResult(Url, routeName, routeValues); 
      } 

      public class AjaxAwareRedirectResult : RedirectToRouteResult { 
       public AjaxAwareRedirectResult(UrlHelper url, string routeName, System.Web.Routing.RouteValueDictionary routeValues) 
        : base(routeName, routeValues) { 
        this.url = url; 
       } 

       private readonly UrlHelper url; 

       public override void ExecuteResult(ControllerContext context) { 
        if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) { 
         string destinationUrl = url.RouteUrl(base.RouteName, base.RouteValues); 
         JavaScriptResult result = new JavaScriptResult() 
         { 
          Script = "window.location='" + destinationUrl + "';" 
         }; 
         result.ExecuteResult(context); 
        } else { 
         base.ExecuteResult(context); 
        } 
       } 
      } 

     }