ASP.NET MVC 路由(4)

原创|其它|编辑:郝浩|2010-02-09 13:32:30.000|阅读 713 次

概述:本文说明如何创建一个自定义的路由约束。它可以阻止被映射的路由除非符合定义的条件。 在本文中,创建了一个本地路由约束。它仅对来自本地的请求映射,对来自Internet的访问请求不映射。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

创建一个自定义的路由约束(C#

    本文说明如何创建一个自定义的路由约束。它可以阻止被映射的路由除非符合定义的条件。

在本文中,创建了一个本地路由约束。它仅对来自本地的请求映射,对来自Internet的访问请求不映射。

通过继承IrouteConstraint接口来实现一个自定义的路由约束。这是一个非常简单的接口,接口定义一个方法如下:

 

bool Match(
    HttpContextBase httpContext,
    Route route,
    string parameterName,
    RouteValueDictionary values,
    RouteDirection routeDirection
)

 

    这个方法返回一个布尔值。如果返回false,这个路由根据约束将不对请求映射。

列表一中的本地约束

列表1---LocalhostConstraint.cs

using System.Web;
using System.Web.Routing;
 
namespace MvcApplication1.Constraints
{
    public class LocalhostConstraint : IRouteConstraint
    {
        public bool Match
            (
                HttpContextBase httpContext, 
                Route route, 
                string parameterName, 
                RouteValueDictionary values, 
                RouteDirection routeDirection
            )
        {
            return httpContext.Request.IsLocal;
        }
 
    }
}

 

    列表1中的约束取得HttpRequest类的一个属性IsLocal。当请求的IP地址是127.0.0.1或者是本机IP就返回真。

    在Global.asax文件中使用自定义的路由约束。列表2中的Global.asax文件使用本地约束去阻止除了本机以外的任何请求访问Admin页。例如,从另外的机器访问请求/Admin/DeleteAll将会失败。

列表2---Global.asax

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using MvcApplication1.Constraints;
 
namespace MvcApplication1
{
 
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
 
            routes.MapRoute(
                "Admin",
                "Admin/{action}",
                new {controller="Admin"},
                new {isLocal=new LocalhostConstraint()}
            );
 
            //routes.MapRoute(
            //    "Default",                                              // Route name
            //    "{controller}/{action}/{id}",                           // URL with parameters
            //    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            //);
        }
 
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

 

    本地约束被用在Admin路由的定义上。这个路由将不会映射来自其它机器的请求。可以想到,其它的在Global.asax中定义的路由会映射同样的请求。理解约束阻止符合的映射请求而不是在Global.asax文件中的所有路由都被定义成这样。

 

    注意在列表2中的Global.asax文件中的默认路由被注释掉了。如果不注释掉,那么默认的路由将会为Admin映射请求。在这种情况下,非法的用户还是可以不通过Admin路由映射而访问Admin 控制。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP