ASP.Net MVC:条件路由如何工作

问题描述:

我不是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

你已经有了你的逻辑翻转。这里是你如何使用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