zoukankan      html  css  js  c++  java
  • Asp.net MVC 学习笔记 (2) 路由

        这一篇主要介绍Asp.net MVC 路由。

       如下为一些配置实例,以豆瓣为例,可以通过辅助工具RouteDebug调试:

    public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
                //我的豆瓣 http://www.douban.com/people/3675683/notes
                routes.MapRoute("mine", "mine/",
                     new { controller = "mine", action = "index" }
                     );
    
                //日志首页   http://www.douban.com/people/123123/notes
                routes.MapRoute("noteIndex", "people/{id}/notes",
                     new { controller = "notes", action = "Index" },
                     new { id = @"^[0-9]*[1-9][0-9]*$", httpMethod = new HttpMethodConstraint("GET") }
                     );
                //匹配的参数为负整数
                //routes.MapRoute("noteIndex1", "people/{id}/notes",
                //    new { controller = "notes", action = "Index" },
                //    new { id = @"^((-\d+)|(0+))$" }
                //    );
    
                //日志详细  http://www.douban.com/note/66652523/
                routes.MapRoute("noteShow", "note/{id}",
                     new { controller = "notes", action = "Show" },
                     new { id = @"^\d+", httpMethod = new HttpMethodConstraint("GET", "POST") }
                     );
                //写日志  http://www.douban.com/note/create
                routes.MapRoute("noteWrite", "note/create",
                      new { controller = "notes", action = "create" }
                      );
                //编辑日志  http://www.douban.com/note/edit/66652523
                routes.MapRoute("noteEdit", "note/update/{id}",
                     new { controller = "notes", action = "edit" },
                     new { id = @"^\d+" }
                     );
    
                //相册   http://www.douban.com/people/3675683/photos   
                routes.MapRoute("albumIndex", "people/{id}/{controller}",
                     new { controller = "mine", action = "index" },
                     new { id = @"^[0-9]*[1-9][0-9]*$", controller = @"(photos|miniblogs|board)" }//controller 为其中的一种
                     );
                routes.MapRoute("albumEdit", "album/update/{id}.html",
                     new { controller = "album", action = "update" },
                     new { id = @"^\d+" }
                     );
    
                routes.MapRoute("albumEdit1", "album/update/{id}_{classid}.html",
                     new { controller = "album", action = "update" },
                     new { id = @"^\d+", classid = @"^\d+" }
                     );
    
    
                // Archive/2008-05-07/123.html 这个还没用判断 月和日的关系
                routes.MapRoute(
                    "archive",
                    "archive/{date}/{id}.html",
                    new { controller = "archive", action = "show" },
                    new { date = @"^\d{4}-\d{2}-\d{2}", id = @"^\d+" });
                //复杂点的  http://www.cnblogs.com/news/2010/10/09/1846556.html
                routes.MapRoute(
                    "news",
                    "news/{year}/{month}/{day}/{id}.html",
                    new { controller = "news", action = "show", year = "", month = "", day = "" },
                    new
                    {
                        id = @"^\d+",
                        year = new YearRouteContraint(),
                        month = new MonthRouteContraint(),
                        day = new DayRouteContraint()
                    });
    
                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                );
    
                
    
            }
    
            protected void Application_Start()
            {
    
                RegisterRoutes(RouteTable.Routes);
                RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
                RouteTable.Routes.RouteExistingFiles = true;
    
    
                //  AreaRegistration.RegisterAllAreas();
    
                //   RegisterRoutes(RouteTable.Routes);
            }
    

       其中自定义路由的类如下,这个到处都有:

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Routing;
    using System.Globalization;
     
    namespace MvcApplication1.UserRoutes
    {
        public class YearRouteContraint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                if ((routeDirection == RouteDirection.IncomingRequest) && (parameterName.ToLower(CultureInfo.InvariantCulture) == "year"))
                {
                    try
                    {
                        int year = Convert.ToInt32(values["year"]);
                        if ((year >= 1900) && (year <= 2100))
                        {
                            return true;
                        }
                        return false;
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                  
                }
                return false;
            }
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Routing;
    using System.Globalization;
     
    namespace MvcApplication1.UserRoutes
    {
        public class MonthRouteContraint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                if ((routeDirection == RouteDirection.IncomingRequest) && (parameterName.ToLower(CultureInfo.InvariantCulture) == "month"))
                {
                    try
                    {
                        int month = Convert.ToInt32(values["month"]);
                        if ((month >= 1) && (month <= 12))
                        {
                            return true;
                        }
                        return false;
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                  
                }
                return false;
            }
        }
    }
    
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Routing;
    using System.Globalization;
     
     
    
    namespace MvcApplication1.UserRoutes
    {
        public class DayRouteContraint:IRouteConstraint
        {
    
            #region IRouteConstraint 成员
    
            public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
            {
                if ((routeDirection == RouteDirection.IncomingRequest) && (parameterName.ToLower(CultureInfo.InvariantCulture) == "day"))
                {
                    try
                    {
                      
    
                        int month = int.Parse(values["Month"].ToString());
                         
                        int day = int.Parse(values["Day"].ToString());
     
    
                        if (month <= 0 || month > 12) return false;
                        if (day < 1) return false;
                        switch (month)
                        {
                            case 1:
                            case 3:
                            case 5:
                            case 7:
                            case 8:
                            case 10:
                            case 12:
                                if (day < 32) return true;
                                break;
                            case 2:
                                if (day < 29) return true;
                                break;
                            case 4:
                            case 6:
                            case 9:
                            case 11:
                                if (day < 31) return true;
                                break;
                        }
                    }
                    catch
                    {
                        return false;
                    }
                }
                return false;
            }
    
            #endregion
        }
    }
    
    

    当然您还可以在Asp.net WebForm中使用路由,这就不介绍了.

     附件:MvcApplication1.rar

  • 相关阅读:
    Run keyword if
    sublime Text如何取消两栏窗口?
    WIN7右键在目录当前打开命令行Cmd窗口
    电脑用HDMI线分屏后,耳机或音箱没声音之完美解决!
    如何解决failed to load the jni shared library问题
    APP测试点
    PHP 根据ip判断其所属地址
    thinkPHP git上传的时候,总是有些文件传不上去,.gitignore解析
    Integrity constraint violation: 1052 Column 'status' in where clause is ambiguous
    tp5导出生成pdf
  • 原文地址:https://www.cnblogs.com/dooom/p/1862013.html
Copyright © 2011-2022 走看看