2012-11-28 30 views
2

我有一個ASP.NET MVC4以下項目的路由配置:在ASP.NET MVC4中,如何重定向到{controller}/{id}?

routes.MapRoute(
    name:  "HttpError", 
    url:   "{controller}/{id}", 
    defaults: new { controller = "Error", action = "Index" }, 
    constraints: new { id = @"\d+" } 
); 

現在,我想知道我怎麼可以創建一個RedirectResultRedirectToRouteResult產生指向/Error/403而不是/Error/Index/403的URL。

的額外信息

我試圖從System.Web.Mvc.AuthorizeAttribute自定義實現未經授權用戶重定向其覆蓋方法裏面:HandleUnauthorizedRequest(AuthorizationContext)

回答

1

使用的HandleUnauthorizedRequest這個方法在你的案例:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary 
                 { 
                  {"action", "Index"}, 
                  {"controller", "Error"}, 
                  {"id", "403"}, 
                 }); 
} 

你必須考慮到你的路線必須放在適當的地方 - 在更多的ge橙花路線,例如:

routes.MapRoute(
      name: "HttpError", 
routes.MapRoute(
      name: "Default", 

如果順序顛倒,MVC將獲取適合的第一條路線,並將您重定向例如以/Error/Index/403而不是/Error/403

+0

我試過你的建議,我得到了:'/ Error/403'。謝謝! –

+0

n/p,不客氣 – jwaliszko

1

重定向到route可以做類似下面的內容:

return RedirectToRoute("HttpError", new { controller = "Error", id = "401" } 

應該沒有產生一個動作的鏈接。

+0

我沒有'RedirectToRoute'方法。我很清楚,我在'Controller'裏面的'AuthorizeAttribute' * not *裏面。無論如何感謝您的時間和奉獻。 :) –

0

您需要更改filterContext.Result像這樣(爲失敗的授權)

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "SomeController", area = "MayBeSomeArea" })); 

你應該這樣做,其中-where要覆蓋AuthorizeAttribute

+0

謝謝,但在這一刻[@Jaroslaw Waliszko的答案更完整](http://stackoverflow.com/a/13607762/439427)。 –

+0

甚至沒有upvote :(大聲笑 – SimonGates

+0

我會嘗試,如果它的工作,我也會upvote它。 –

0

我不認爲這正是你要找的,但對我來說,只是返回這樣的事情已經足夠

return RedirectToRoute(new {controller = "controller_name", 
          action = "action_name"}); 
+0

你是對的,而不是重定向到控制器/操作,我正在尋找重定向到控制器/ ID(不採取行動)。 –

+0

另外,我不能這樣做,因爲我沒有'RedirectToRoute'方法,因爲我是從'AuthorizeAttribute'派生的派生類。 –

+0

@RubensMariuzzo哦,夠公平的,現在我看到你的其他評論說同樣的話! – TankorSmash