MVC 应用程序的自定义路由






4.63/5 (8投票s)
提供关于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。
路由约束
创建自定义路由时,还可以包含路由约束。这些约束用于限制请求以匹配路由。有三种基本类型的约束
- 正则表达式约束
HttpMethod
约束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 操作(例如 POST
、GET
等)进行匹配。如果您希望阻止用户在发生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);
并运行您的应用程序。您将在浏览器中看到以下屏幕

您可以在所有路由表中看到所有自定义路由,它将显示您的浏览器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日:首次发布