zoukankan      html  css  js  c++  java
  • MVC TIP2:路由

    1:简单路由

    建立MVC的时候会给我们创建默认的路由,如下:

                routes.MapRoute(
                    "Default", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
                );

    表示假设你在浏览器的地址栏输入了下面的URL:

    /Home/Index/3

    默认的路由将这个URL映射为下面的参数:

    Controller = Home

    Action = Index

    id = 3

    当你请求URL /Home/Index/3时,将会执行下面的代码:

    HomeController.Index(3)

    Default路由包含了所有三个参数的默认值。如果你不提供控制器,那么控制器参数默认值为Home。如果你不提供动作,动作参数默认为值Index。最后,如果你不提供id,id参数默认为空字符串。

    2:创建一个自定义路由

                routes.MapRoute(
                    "RouteTemp", // Route name
                    "Archive/{entryDate}",  // URL with parameters
                    new { controller = "Archive", action = "Entry" } // Parameter defaults
                );

    上面的代码意味着我们让路由匹配到http://localhost:52588/Archive/1911-1-1这样的URL。

    3:下面是设计URL路由的原则

    3.1 建立简单清晰的URL

    在WEB-FORM中可能得到这样的URL:

    events_by_month.aspx/year=2008&month=4

    这样的URL没有如下的URL好:

    events/2008/04

    这也叫永久URL,同样,这也标识了我们可以为路由动作建立多个参数。

    3.2 建立可编程的URL

    events/2008/04

    这表示删除04,能够得到2008年的所有记录是合理的。

    3.3 允许URL参数冲突

    应该能同时允许

    events/2008/04

    events/someeventsname

    3.4 避免暴露数据库ID

    events/17

    这样的URL可能暴露了数据库ID,应该做简单的处理,如

    events/ID17

    这也会比第一个URL要好。

    3.5 考虑SEO

    可以在路由中加入关键字,如

    events/ID17/MVC

    3.6 提供CATCH ALL路由

    必须为所有未匹配的路由添加的控制器,如下:

                routes.MapRoute(
                    "catch-all",
                    "{*catchall}",
                    new { controller = "Error", action = "NotFound" }
                );

    经过上面的处理,所有未处理的URL,都会交给ErrorController的NotFound处理,如下:

        public class ErrorController : Controller
        {
            public string NotFound()
            {
                return "not found!";
            }
        }

    3.7 注意路由的次序

    路由匹配有先后次序,在3.6中,我们会发现,如果输入http://localhost:52588/xx,结果IE显示:

    KP`[6`E{~EJ$YQ90){X`H56

    查看我们的路由设置:

    WN$FEN$_K``~0XLE@L]E3H3

    发现,因为URLhttp://localhost:52588/xx,被路由Default路由走了。将这个默认的路由去掉,一切就OK了。

    4:路由约束

    有的时候,我们需要,如下的URL

    http://localhost:52588/Product/17

    被路由到一个处理ID的控制器,而

    http://localhost:52588/Product/Rice

    则被路由到一个处理商品名称的控制器,这就需要我们建立路由约束。如下:

                routes.MapRoute(
                    "Product",
                    "Product/{productId}",
                    new { controller = "Product", action = "Details" },
                    new { productId = @"\d+" }
                 );
                routes.MapRoute(
                    "Product2",
                    "Product/{entryArg}",
                    new { controller = "Archive", action = "Entry" }
                 );

    可以看到,前者我们路由到控制器ProductController,而后者则路由到了ArchiveController。

    再次强调一遍,在整个项目开始以前,设计好路由是很重要的一个环节。

    注意,可以使用实现IRouteConstraint接口来创建自定义路由约束,但是更建议使用像上面这样的正则匹配。

    5:Views和Controllers文件夹

    这两个文件夹已经成为MVC的默认文件夹,如果我们想创建页面不受MVC控制,则需要新建另外的文件夹。

  • 相关阅读:
    C# 托管内存与非托管内存之间的转换
    A*算法详解链接
    【转】使用minizip解压缩多个文件(基于zlib)
    lua中table的遍历,以及删除
    clientHeight scrollHeight offsetHeight
    消息中间件(转)
    js 原型链和继承(转)
    session 和 cookie (转)
    java servlet
    redis 命令
  • 原文地址:https://www.cnblogs.com/luminji/p/2118649.html
Copyright © 2011-2022 走看看