2011-08-16 33 views
22

Trong ứng dụng web của tôi, tôi đang xác thực url từ glabal.asax. Tôi muốn xác thực url và cần chuyển hướng đến một hành động nếu cần. Tôi đang sử dụng Application_BeginRequest để bắt sự kiện yêu cầu.Chuyển hướng đến một hành động từ global.asax - mvc

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     // If the product is not registered then 
     // redirect the user to product registraion page. 
     if (Application[ApplicationVarInfo.ProductNotRegistered] != null) 
     { 
      //HOW TO REDIRECT TO ACTION (action=register,controller=product) 
     } 
    } 

Hoặc là có cách nào khác để xác nhận từng url trong khi nhận được yêu cầu trong MVC và chuyển hướng đến một hành động nếu cần thiết

+0

có thể trùng lặp của http://stackoverflow.com/questions/580728/redirecting-from-global-asax-in-medium-trust – Baz1nga

Trả lời

22

Sử dụng mã dưới đây để chuyển hướng

Response.RedirectToRoute("Default"); 

"mặc định" là tên đường. Nếu bạn muốn chuyển hướng đến bất kỳ hành động nào, chỉ cần tạo tuyến đường và sử dụng tên tuyến đường đó.

+3

này sẽ tạo ra một vòng lặp – Fourat

+0

@null Pointer, xin vui lòng có thể bạn chấp nhận một các câu trả lời khác hoạt động? –

+0

tạo vòng lặp như @Fourat chỉ ra – invertigo

-2

Bạn có thể thử với điều này:

Context.Response.Redirect() ;

Không chắc chắn.

5

Hãy thử điều này:

HttpContext.Current.Response.Redirect("..."); 
18

Tất cả những điều trên sẽ không hoạt động, bạn sẽ ở trong vòng lặp thực hiện phương thức Application_BeginRequest.

Bạn cần phải sử dụng

HttpContext.Current.RewritePath("Home/About"); 
+0

Đây là câu trả lời đúng. – pimbrouwers

0
Response.RedirectToRoute(
           new RouteValueDictionary { 
            { "Controller", "Home" }, 
            { "Action", "TimeoutRedirect" }} ); 
+0

Điều đó sẽ không hoạt động trong 'Application_BeginRequest'. – AgentFire

+0

Điều này sẽ gây ra một yêu cầu khác; điều này sẽ gây ra một yêu cầu khác. Mà gây ra một yêu cầu khác. Mà tạo khác. Cho đến khi nó lỗi hoàn toàn. –

2

tôi làm điều đó như thế này:

 HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context); 

     RouteData routeData = new RouteData(); 
     routeData.Values.Add("controller", "Home"); 
     routeData.Values.Add("action", "FirstVisit"); 

     IController controller = new HomeController(); 

     RequestContext requestContext = new RequestContext(contextWrapper, routeData); 

     controller.Execute(requestContext); 
     Response.End(); 

cách này bạn quấn bối cảnh yêu cầu đến và chuyển hướng nó vào một nơi khác mà không chuyển hướng khách hàng. Vì vậy, chuyển hướng sẽ không kích hoạt một BeginRequest khác trong global.asax.

7

Bên cạnh những cách được đề cập. Một cách khác là sử dụng URLHelper mà tôi sử dụng trong một kịch bản một lần happend lỗi và người dùng sẽ được chuyển hướng đến trang đăng nhập:

public void Application_PostAuthenticateRequest(object sender, EventArgs e){ 
    try{ 
     if(!Request.IsAuthenticated){ 
      throw new InvalidCredentialException("The user is not authenticated."); 
     } 
    } catch(InvalidCredentialException e){ 
     var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
     Response.Redirect(urlHelper.Action("Login", "Account")); 
    } 
} 
+1

Điều đó gây ra một yêu cầu khác. Mà lần lượt làm khác ,. Mà làm khác. Và cứ thế khi bạn đang ở trong hàm yêu cầu application_begin. –

+1

@RichardBarker Mã này không nằm trong yêu cầu application_begin !!!!Tôi đặt nó trong Application_PostAuthenticateRequest một trong khối catch trong cas lỗi happend –

+0

Xin lỗi của tôi. Câu hỏi cho thấy BeginRequest. Tôi có thể đề nghị bạn cập nhật câu trả lời của bạn để cho thấy điều đó và giải thích tại sao bạn đã làm điều đó? –

0

Tôi đã có một ứng dụng hình thức web cũ tôi đã chuyển đổi sang MVC 5 và một trong những yêu cầu đã hỗ trợ các liên kết {old_form} .aspx có thể có. Trong Global.asax Application_BeginRequest tôi thiết lập một câu lệnh switch để xử lý các trang cũ để chuyển hướng đến các trang mới và để tránh vòng lặp không thể thực hiện được đối với kiểm tra định tuyến nhà/tuyến mặc định cho ".aspx" trong URL thô của yêu cầu.

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     OldPageToNewPageRoutes(); 
    } 

    /// <summary> 
    /// Provide redirects to new view in case someone has outdated link to .aspx pages 
    /// </summary> 
    private void OldPageToNewPageRoutes() 
    { 
     // Ignore if not Web Form: 
     if (!Request.RawUrl.ToLower().Contains(".aspx")) 
      return; 

     // Clean up any ending slasshes to get to the old web forms file name in switch's last index of "/": 
     var removeTrailingSlash = VirtualPathUtility.RemoveTrailingSlash(Request.RawUrl); 
     var sFullPath = !string.IsNullOrEmpty(removeTrailingSlash) 
      ? removeTrailingSlash.ToLower() 
      : Request.RawUrl.ToLower(); 
     var sSlashPath = sFullPath; 

     switch (sSlashPath.Split(Convert.ToChar("/")).Last().ToLower()) 
     { 
      case "default.aspx": 
       Response.RedirectToRoute(
        new RouteValueDictionary 
        { 
         {"Controller", "Home"}, 
         {"Action", "Index"} 
        }); 
       break; 
      default: 
       // Redirect to 404: 
       Response.RedirectToRoute(
        new RouteValueDictionary 
        { 
         {"Controller", "Error"}, 
         {"Action", "NotFound"} 
        }); 
       break; 

     } 
    } 
Các vấn đề liên quan