65.9K
CodeProject 正在变化。 阅读更多。
Home

MVC 应用程序的自定义路由

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (8投票s)

2011年12月13日

CPOL

4分钟阅读

viewsIcon

111470

downloadIcon

1675

提供关于ASP.NET MVC路由架构的详细信息,并自定义您的ASP.NET MVC应用程序的URL结构。

引言

当您在MVC应用程序中请求任何页面时,它将通过路由架构。您的路由系统将决定您的URL模式。默认的路由算法类似于{控制器}/ {动作}/ {id}模式。但是,可以使用自定义路由来更改该模式。

在本文中,我们将展示如何创建自定义路由、调试路由和路由约束。

使用默认路由

您可以在Global.aspx应用程序启动事件中配置路由。当您创建MVC应用程序时,它已经定义了默认路由。可以使用以下代码配置默认路由

routes.MapRoute(
“Default”,  //Route Name
 “{controller}/{action}/{id}” //Url With Parameters
, new { controller = “Home”, action = “Index”, id = ““} // Parameter Defaults
);

自定义路由

可以在不创建自定义路由的情况下开发MVC应用程序。但是,有时需要更改URL的模式,在这种情况下创建自定义路由是有意义的。

现在,我们以一个简单的自定义路由示例为例。假设您要创建一个博客应用程序,并且您希望路由的请求看起来像:/Archive/12-25-2010。

第一步是创建一个空的MVC应用程序。然后添加名为BlogController.cs的控制器文件,并添加名为Archive的动作,并插入以下代码

public class BlogController : Controller
    {
        //
        // GET: /Blog/

        public string Archive(DateTime? entryDate)
        {
            return "You wants Blog Entry on Date:=" + entryDate.ToString();
        }


        public ActionResult Insert()
        {
            ViewData["Message"] = "Call From the Insert Action When Get Http Occurs";
            return View();
        }
    }

现在转到Global.asax文件,并将以下代码添加到Register Routes方法中。

//Simple Custom Route with out any Constraints
routes.MapRoute(
                "BlogWithoutConstraint",
                "Archive/{entrydate}",
                new { Controller = "Blog", action = "Archive", });

此代码用于添加自定义路由,它将匹配类似于Archive/12-25-2010的URL。

路由约束

创建自定义路由时,还可以包含路由约束。这些约束用于限制请求以匹配路由。有三种基本类型的约束

  1. 正则表达式约束
  2. HttpMethod约束
  3. CatchAll

正则表达式约束

您可以使用正则表达式约束来检查路由的模式并防止无效的请求。正则表达式用于检查任何模式,例如货币、日期、时间等。

在上面的BlogArchive示例中,URL 类似于 Archive/12-25-2010 和 Archive/mybirthday。

它将被允许。现在我们必须阻止不是日期的参数。因此,可以使用正则表达式约束。为此,将以下代码添加到Global.aspx文件Register Route方法中。

//Custom Route With Regular Expression Constraints
            routes.MapRoute(
                "Blog",
                "Archive/{entrydate}",
                new { Controller = "Blog", action = "Archive" }, 
        new { entryDate = @"\d{2}-\d{2}-\d{4}" });

上面的代码匹配的输入日期必须匹配两位小数,后跟短划线,后跟两位小数,后跟短划线,后跟四位小数的模式。

HTTP 方法约束

您可以将路由与任何类型的 HTTP 操作(例如 POSTGET 等)进行匹配。如果您希望阻止用户在发生GET操作时访问特定URL,但在发生POST操作时不阻止,可以使用AcceptVerbs代替HttpMethod约束。

例如,BlogArchive示例的inserts Action仅在执行HTTP GET操作时执行。为此,您必须将以下代码添加到Global.asax文件Register Route方法中。

//Custom Route With HttpMethod Constraint
            routes.MapRoute(
                "HttpMethodConstraintRoute",
                "Blog/Insert",
                new { Controller = "Blog", action = "Insert" }, 
        new { method = new HttpMethodConstraint("GET") });

捕获所有路由

通常,您的URL必须与段数匹配,但是如果您希望匹配您的URL,而不管段数如何,那么我们必须创建捕获所有参数。现在以一个简单的捕获所有路由示例为例,为此添加一个名为CatchAllController的控制器,并将以下代码添加到控制器中。

public class CatchAllController : Controller
{
        //
        // GET: /Sort/
       public string Index(string AllValues)
       {
          string[] PassedValue = AllValues.Split('/');
          return "You are Passing Values:" + String.Join(",", PassedValue);
       }
}

现在要捕获所有参数,请将以下代码添加到global.asax文件的注册路由方法中。

//Custom Route Catch-All  Routes
      routes.MapRoute(
           "CatchAllRoute",
            "CatchAll/{*AllValues}",
            new { Controller = "CatchAll", action = "Index" });

现在它将匹配以下URL,例如 CatchAll/index/1/2/3/4/5/6/7 和 CatchAll/a/b/c/d/e/f/g/h/。

捕获所有参数必须作为最后一个参数出现。将捕获所有参数视为参数数组。

调试路由

创建自定义路由后,您必须检查您的路由是否与给定的URL完美配合。为此,您必须调试您的路由。要调试路由,您必须从http://code.haacked.com/mvc-1.0/RouteDebug-Binary.zip下载一个DLL,并将其添加到您的MVC应用程序中。

现在要调试路由,您必须将以下代码行写入Global.asax应用程序启动事件。

RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

并运行您的应用程序。您将在浏览器中看到以下屏幕

RouteTesting.JPG

您可以在所有路由表中看到所有自定义路由,它将显示您的浏览器URL与哪些路由匹配。如果它将匹配任何路由,它将在Match Current Request Routes中显示true,否则它将显示false。您可以使用另一个URL进行检查,为此您必须将URL写入地址栏中。

现在写入URL,例如 CatchAll/1/2/3/4/5/6/。它将与Catchall CustomRoutes匹配。

通过这种方式,您也可以检查其他路由。您的URL可能与多个路由匹配,此时将执行第一个匹配的路由。

结论

本文的目标是演示ASP.NET MVC提供的路由系统的灵活性。希望这有帮助!

历史

  • 2011年12月13日:首次发布
© . All rights reserved.