创建自定义路由 (C#)

Microsoft

了解如何将自定义路由添加到 ASP.NET MVC 应用程序。 本教程介绍如何修改 Global.asax 文件中的默认路由表。

本教程介绍如何将自定义路由添加到 ASP.NET MVC 应用程序。 了解如何使用自定义路由修改 Global.asax 文件中的默认路由表。

对于许多简单的 ASP.NET MVC 应用程序,默认路由表将正常工作。 但是,你可能会发现你有专门的路由需求。 在这种情况下,可以创建自定义路由。

例如,假设你正在生成一个博客应用程序。 你可能想要处理如下所示的传入请求:

/Archive/12-25-2009

当用户输入此请求时,你想要返回与日期 2009/12/25 相对应的博客条目。 若要处理此类请求,需要创建自定义路由。

清单 1 中的 Global.asax 文件包含名为 Blog 的新自定义路由,该路由处理类似于 /Archive/entry 日期的请求。

清单 1 - 使用自定义路由) 的 Global.asax (

using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Blog",                                           // Route name
                "Archive/{entryDate}",                            // URL with parameters
                new { controller = "Archive", action = "Entry" }  // Parameter defaults
            );
            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);
        }
    }
}

添加到路由表的路由顺序非常重要。 我们新的自定义博客路由是在现有默认路由之前添加的。 如果反转了顺序,则默认路由将始终被调用,而不是自定义路由。

自定义博客路由与以 /Archive/ 开头的任何请求匹配。 因此,它匹配以下所有 URL:

  • /Archive/12-25-2009

  • /Archive/10-6-2004

  • /Archive/apple

自定义路由将传入请求映射到名为 Archive 的控制器,并调用 Entry () 操作。 调用 Entry () 方法时,输入日期将作为名为 entryDate 的参数传递。

可以将博客自定义路由与清单 2 中的控制器配合使用。

清单 2 - ArchiveController.cs

using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class ArchiveController : Controller
    {
        public string Entry(DateTime entryDate)
        {
            return "You requested the entry from " + entryDate.ToString();
        }
    }
}

请注意,清单 2 中的 Entry () 方法接受类型为 DateTime 的参数。 MVC 框架足够智能,可以自动将输入日期从 URL 转换为 DateTime 值。 如果无法将 URL 中的条目日期参数转换为 DateTime,则会引发错误 (请参阅图 1) 。

图 1 - 转换参数出错

“新建项目”对话框

图 01:转换参数时出错 (单击以查看全尺寸图像)

总结

本教程的目的是演示如何创建自定义路由。 你已了解如何将自定义路由添加到表示博客条目的 Global.asax 文件中的路由表。 我们讨论了如何将博客文章请求映射到名为 ArchiveController 的控制器和名为 Entry () 的控制器操作。