2016-03-07 149 views
1

我不是MVC中的高級開發人員。ASP.Net MVC:條件路由如何工作

我剛剛看了一個帖子,從這個網址Defining conditional routes

的問題是,如果用戶以管理員身份登錄,然後他會重定向到管理器,如果用戶登錄使用普通用戶那麼他將被重定向爲用戶控制器。

這是事情已經完成,但我只是不明白代碼是如何工作的。所以幫助我理解代碼。

using System; 
using System.Web; 
using System.Web.Routing; 

namespace Examples.Extensions 
{ 
    public class MustBeAdmin : IRouteConstraint 
    { 
     public MustBeAdmin() 
     { } 

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      // return true if user is in Admin role 
      return httpContext.User.IsInRole("Admin"); 
     } 
    } 
} 

routes.MapRoute(
    "Admins", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional }, // Parameter default 
    new { controller = new MustBeAdmin() } // our constraint 
); 

1)布爾匹配()是任何在內置方法,或者它的用戶定義一個?

2)已經採取行動,並控制提這樣的路線

new { controller = "Admin", action = "Index", id = UrlParameter.Optional } 

,但再次提起同樣喜歡這樣

new { controller = new MustBeAdmin() } 

3)這是什麼線的含義{ controller = new MustBeAdmin() } ?

沒有具體說明如果用戶以普通用戶身份登錄,那麼他將被重定向到用戶控制器。

請幫我理解代碼。

謝謝

+0

爲什麼負標記。我想了解路由約束如何工作,這就是爲什麼我發佈它。 – Thomas

+0

智能感知和互聯網應該爲您解答這些問題http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints – Jasen

回答

1

你已經有了你的邏輯翻轉。這裏是你如何使用NotEqual約束排除缺省路由/管理頁面:

using System; 
using System.Web; 
using System.Web.Routing; 

public class NotEqual : IRouteConstraint 
{ 
    private string _match = String.Empty; 

    public NotEqual(string match) 
    { 
    _match = match; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
    return !httpContext.User.IsInRole(_match); 
    } 
} 

routes.MapRoute(
    "Admins", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Admin", action = "Index", id = UrlParameter.Optional }, // Parameter default 
    new { controller = new NotEqual("Admin") } 
); 

它永遠不會匹配一個非管理員。

Match是在IRouteConstraint interface的方法:

+0

當它不匹配時那麼會發生什麼........錯誤將顯示在瀏覽器中? – Thomas

+0

不一定。我認爲如果找不到路由,你會得到一個404,但你可以用全局默認路由或自定義404頁面來處理。 – toddmo

+0

可以將我重定向到正確的文章,指導我如何處理404錯誤,如果沒有路線找到?我也想知道如何用全局默認路由或自定義404頁面來處理它。尋找你的進一步幫助。謝謝 – Thomas