玩转 Route

Handler类:
DefaultRouteHandler
 1  public class DefaultRouteHandler:IRouteHandler

 2     {

 3       

 4         IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)

 5         {

 6             if (requestContext == null)

 7                 throw new ArgumentNullException("requestContext");                

 8             RouteData rd=requestContext.RouteData;

 9             var dr=rd.Route as CustomRoute;

10             if (dr == null)

11                 throw new ArgumentException("The argument RequestContext does not have DynamicDataRoute");

12             string viewName=dr.GetFieldFromRouteData(rd, "ViewName");

13             string category=dr.GetFieldFromRouteData(rd, "Category");

14             if (string.IsNullOrEmpty(viewName))              

15                 throw new ArgumentNullException("ViewName");

16             if (string.IsNullOrEmpty(category))

17                 throw new ArgumentNullException("Category");

18             return HandlerHelper.CreateHandler(category,viewName); 

19         }

20 

21         public RequestContext GetRequestContext(HttpContext httpContext, RouteData routedata)

22         {

23             return new RequestContext(new HttpContextWrapper(httpContext), routedata);

24         }

25 

26         public RequestContext GetRequestContext(HttpContext httpContext)

27         {

28             return GetRequestContext(httpContext, new RouteData());

29         }

30        

31     }
PreRouteHandler
 1 public  class PreRouteHandler : IRouteHandler

 2     {

 3        IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)

 4        {

 5            if (requestContext == null)

 6                throw new ArgumentNullException("requestContext");

 7            RouteData rd=requestContext.RouteData;

 8            var dr=rd.Route as CustomRoute;

 9            if (dr == null)

10                throw new ArgumentException("The argument RequestContext does not have DynamicDataRoute");

11            string viewName=dr.GetFieldFromRouteData(rd, "ViewName");

12            string category=dr.GetFieldFromRouteData(rd, "Category");

13            string pre=dr.GetFieldFromRouteData(rd, "Pre");

14            if (string.IsNullOrEmpty(viewName))

15                throw new ArgumentNullException("ViewName");

16            if (string.IsNullOrEmpty(category))

17                throw new ArgumentNullException("Category");

18            if (string.IsNullOrEmpty(pre))

19               throw new ArgumentNullException("Pre");

20            return HandlerHelper.CreateHandler(category, viewName, pre);

21        }

22     }
HandlerHelper
 1 //由相关参数 引用虚拟目录中的文件文件  进行响应

 2    public class HandlerHelper

 3     {

 4         const string BaseFolderVirtualPath="~/HandlerFolder/";

 5        

 6         public static IHttpHandler CreateHandler(string path)

 7         {

 8             IHttpHandler ret = null;

 9             VirtualPathProvider vpp = HostingEnvironment.VirtualPathProvider;

10             if (vpp != null && vpp.FileExists(path))

11                 ret = BuildManager.CreateInstanceFromVirtualPath(path, typeof(Page)) as IHttpHandler;

12             return ret;

13         }

14 

15         public static IHttpHandler CreateHandler(string Category, string ViewName)

16         {

17             string path=BaseFolderVirtualPath+Category+"/"+ViewName+".aspx";

18             return CreateHandler(path);

19         }

20         public static IHttpHandler CreateHandler(string Category, string ViewName,string Pre)

21         {

22             string path=BaseFolderVirtualPath+Category+"/"+Pre+"-"+ViewName+".aspx";

23             return CreateHandler(path);

24         }

25     }

 Route路由类:

CustomRoute
 1  //获取路由之中 传递的 变量信息

 2     public class CustomRoute: Route

 3     {

 4         public CustomRoute(string url)

 5             : base(url, null)

 6         {

 7             RouteHandler=new DefaultRouteHandler();

 8         }

 9 

10         public CustomRoute(string url, IRouteHandler handler)

11             : base(url, handler)

12         {

13             

14         }

15          

16         public override VirtualPathData GetVirtualPath(RequestContext requestContext

17                                                           , RouteValueDictionary values)

18         {            

19             return base.GetVirtualPath(requestContext, values);

20         }

21         public override RouteData GetRouteData(HttpContextBase httpContext)

22         {            

23             return base.GetRouteData(httpContext);              

24         }

25 

26 

27         public string GetFieldFromContext(HttpContextBase httpContext,string fieldName)

28         {

29             return GetFieldFromRouteData(GetRouteData(httpContext), fieldName);

30         }

31         public string GetFieldFromRouteData(RouteData routeData,string fieldName)

32         {

33             if (routeData == null)

34                 throw new ArgumentNullException("routeData");

35              return routeData.GetRequiredString(fieldName);

36         }

37     }
1     //针对 .aspx内 生成相应路由名下的Url

2     public static  class RouteUrlHelper 3     {
获取 路由的 Url信息
 1         //根据参数表 自由匹配       

 2         public static string GetUrl(Dictionary<string,string> routeValueDic)

 3         {

 4             RouteValueDictionary parameters = new RouteValueDictionary(routeValueDic);

 5             VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, parameters);

 6             return vpd.VirtualPath;

 7         }      

 8 

 9         public static string GetUrl(string routeName, Dictionary<string, object> routeValueDic)

10         {

11             RouteValueDictionary parameters = new RouteValueDictionary(routeValueDic);

12             return GetUrl(routeName, parameters);

13         }

14         public static string GetUrl(string routeName,object routeValue)

15         {

16             RouteValueDictionary parameters = new RouteValueDictionary(routeValue);

17             return GetUrl(routeName, parameters);

18         }

19         public static string GetUrl(string routeName,string[] routeKeys,string [] routeValues)

20         {

21             RouteValueDictionary parameters = new RouteValueDictionary();

22             int count=Math.Max(routeKeys.Length, routeValues.Length);

23             for(int i=0;i<count;i++)          

24             {

25                 parameters.Add(routeKeys[i], routeValues[i]);

26             }

27             return GetUrl(routeName, parameters);

28         }

29 

30         public static string GetUrl(string routeName, RouteValueDictionary routeValue)

31         {

32             var route=RouteTable.Routes[routeName];

33             if (route!=null)

34             {

35                 VirtualPathData vpd = RouteTable.Routes.GetVirtualPath(null, routeName, routeValue);

36                 return vpd.VirtualPath;                

37             }

38             return "";

39         }
 
   
Page 扩展方法 获取路由Url
 1  

 2         // 获取当前 Page 在某个路由下的Url表现

 3         public static string GetUrl(this Page page, string routeName)

 4         {

 5             return GetUrl(page, routeName, page.Request.RequestContext.RouteData.Values);

 6         }

 7 

 8         public static string GetUrl(this Page page, string routeName, object routeValue)

 9         {

10             return GetUrl(page, routeName, new RouteValueDictionary(routeValue));

11         }

12         public static string GetUrl(this Page page, string routeName, Dictionary<string, object> routeValue)

13         {

14             return GetUrl(page, routeName, new RouteValueDictionary(routeValue));

15         }

16         public static string GetUrl(this Page page, string routeName, RouteValueDictionary routeValue)

17         {

18             var route=(CustomRoute)RouteTable.Routes[routeName];

19             if (route!=null)

20             {

21                 VirtualPathData vpd =route.GetVirtualPath(page.Request.RequestContext, routeValue);

22                 return vpd.VirtualPath;

23             }

24             return "";

25         }

26  
其他工具方法
 1          public static Dictionary<string,string> GetRouteKeys(string routeName)

 2         {

 3             Route route=RouteTable.Routes[routeName] as Route;

 4             Dictionary<string,string> keyAndValues=new Dictionary<string,string>();

 5             if (route!=null)

 6             {

 7                 Regex reg=new Regex(@"\{([a-zA-Z0-9_]+)\}",RegexOptions.Compiled);

 8                var ms=reg.Matches(route.Url);

 9                foreach (Match m in ms)

10                {

11                    keyAndValues.Add(m.Groups[0].Value.Trim('{', '}'), "");

12                }                     

13             }

14             foreach (var item in route.Constraints)

15             {

16                 if (keyAndValues.ContainsKey(item.Key))

17                 {

18                     keyAndValues[item.Key]=item.Value.ToString();

19                 }

20             }

21             return keyAndValues;

22         }

23 

24         public static Dictionary<string,string> GetRouteDefaults(string routeName)

25         {

26             Route route=RouteTable.Routes[routeName] as Route;

27             Dictionary<string, string> defaults=new Dictionary<string, string>();

28             if (route!=null)

29             {

30                 if (route.Defaults!=null)

31                     foreach (var item in route.Defaults)

32                         defaults.Add(item.Key, item.Value.ToString());                  

33             }

34             return defaults;

35         }

36 

37         public static void SetRouteDefaultValue(string routeName,string paramName, string defaultValue)

38         {

39             Route route=RouteTable.Routes[routeName] as Route;

40             if (route!=null)

41             {

42                 if(route.Defaults.ContainsKey(paramName))

43                 {

44                     route.Defaults[paramName]=defaultValue;

45                 }

46             }

47         }

48 

49 

50         // 取页面中的 路由 参数值

51         public static string GetRouteValue(Page page,string fieldName)

52         {

53             return GetRouteValue(page.RouteData, fieldName);

54         }

55         public static string GetRouteValue(RouteData data, string fieldName)

56         {

57                object value;

58                if (data.Values.TryGetValue(fieldName, out value))

59                    return value.ToString();

60                return string.Empty;

61         }
4     }

 Global.asax.cs:

Global
 1  public class Global : System.Web.HttpApplication

 2     {

 3 

 4         public static void RegisterRoutes(RouteCollection routes)

 5         {   

 6             // 屏蔽 某些请求

 7             //routes.Add("ignor", new Route("route/onedetail/{id}", new StopRoutingHandler()));

 8             routes.Add("default", new CustomRoute("ShowDetail{Category}.tt")

 9             {   

10                 Defaults=new RouteValueDictionary(new{

11                     ViewName="Detail"

12                 }),

13                 Constraints = new RouteValueDictionary(new

14                 {

15                     Category="one|five"

16                 })

17             });

18             routes.Add("category", new CustomRoute("route/{Category}/{ViewName}.tt")

19                      { 

20                         ////约束取值

21                         Constraints = new RouteValueDictionary(new

22                         {

23                             ViewName="List|Detail|Edit|Insert|Delete" 

24                         })

25                      }

26                   );

27             routes.Add("addpre", new CustomRoute("route/{Category}/{Pre}/{ViewName}.tt")

28                 {

29                     RouteHandler=new PreRouteHandler(),

30                     Constraints = new RouteValueDictionary(new

31                     {

32                         ViewName="List|Detail|Edit|Insert|Delete"

33                     })

34                 }

35             );         

36 

37         }

38 

39         //传参数 对文件 就行数据绑定

40         public static void MapRoute(RouteCollection routes)

41         {  

42            // 若要设置 HTTP 谓词约束,可以将某个词典元素的值设置为 

43            //HttpMethodConstraint 对象,并将相关键设置为任何名称。

44             string[] allowedMethods = {"GET","POST"};

45             HttpMethodConstraint methodConstraints = new HttpMethodConstraint(allowedMethods);

46 

47             //测试:添加路由的顺序 越前面 优先级越高

48             //routes.MapPageRoute("youxianji",

49             //                 "route/onedetail/{id}",

50             //                 "~/HandlerFolder/two/detail.aspx");

51 

52 

53             //如果页面使用 Url:ShowDetailone.aspx  将不会传输Id 参数

54             routes.MapPageRoute("custom",

55                                "route/onedetail/{id}",

56                                "~/HandlerFolder/one/detail.aspx",

57                                false,

58                                new RouteValueDictionary { { "id", "101" } },// 默认取值 id=101

59                                new RouteValueDictionary { { "id", @"\d+" },{"httpMethod",methodConstraints}});

60 

61 

62 

63           

64         

65                               

66         }

67         void Application_Start(object sender, EventArgs e)

68         {

69              RegisterRoutes(RouteTable.Routes);

70              MapRoute(RouteTable.Routes);

71         }       

72     }

~/HandlerFolder/one/Detail.aspx.cs:

one/detail.aspx.cs
 1  public partial class Detail : System.Web.UI.Page

 2     {

 3         protected Dictionary<string, string> keyAndvalues;

 4         protected Dictionary<string,string> defaults;

 5 

 6         protected void Page_Load(object sender, EventArgs e)

 7         {  

 8             //通过路由来 生成Url地址       

 9             keyAndvalues=RouteUrlHelper.GetRouteKeys("addpre");

10 

11             defaults=RouteUrlHelper.GetRouteDefaults("custom");

12             // 数据绑定的参数

13             routedata.Text=Page.RouteData.Values["id"].ToString();

14             

15         }

16 

17         protected void btnChangeDefault_Click(object sender, EventArgs e)

18         {  

19             int id;

20             if(int.TryParse(RouteUrlHelper.GetRouteDefaults("custom")["id"],out id))

21                 id+=100;

22             else

23                 id=DateTime.Now.Millisecond;

24             RouteUrlHelper.SetRouteDefaultValue("custom", "id", id.ToString());

25         }

26     }

~/HandlerFolder/one/Detail.aspx:

one/detail.aspx.cs
 1 <html xmlns="http://www.w3.org/1999/xhtml">

 2 <head runat="server">

 3     <title></title>

 4 </head>

 5 <body>

 6     <form id="form1" runat="server">

 7     <div>    

 8      

 9      路由传递参数:

10      

11       <asp:Label runat="server" ID="routedata"></asp:Label>

12 

13     </div>

14     <div>

15     <br /><br />

16     根据路由名以及相对于的参数 获取对应的Url:<br />

17     <div><%=RouteBiz.RouteUrlHelper.GetUrl("addpre",new string[]{"Category","Pre","Viewname"},

18                                                     new string[]{"two", "QQ", "List"})%></div>

19     

20     <div><%=RouteBiz.RouteUrlHelper.GetUrl("category",new {Category="two",Viewname="delete"})%></div>

21      

22      <div><%=RouteBiz.RouteUrlHelper.GetUrl("custom",new {id="135"})%> </div>

23     

24      <br /><br />

25 

26      路由参数 以及限制的取值集合:<br />

27       <%foreach (var item in keyAndvalues)

28         {%>

29           <div><span> <%=item.Key %></span>::<span><%=item.Value %></span></div> 

30 

31       <%}%>

32 

33       <br /><br />

34       路由参数中的 默认值: <asp:Button ID="btnChangeDefault" runat="server" Text="ChangeRouteDefaultValue" 

35             onclick="btnChangeDefault_Click" />

36       <%foreach (var item in defaults)

37         { %>

38         <div> <%=item.Key%>  :: <%=item.Value %></div>

39       <%}%>

40     </div>

41     </form>

42 </body>

43 </html>

 

玩转 Route 玩转 Route

 [注意] HandlderFolder/two 下面的文件都是空文件,测试用的,如果相应的url ,查看是否能正常显示.

你可能感兴趣的:(route)