MVC 路由中最经典的就是:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
其实这们routes的类型是RouteCollection, 更精确点说是System.Web.Routing.RouteCollection
是ASP.NET中本来就有的,不是专为MVC编写的。
routes.MapRoute这个方法的重载有6个之多
public static Route MapRoute(this RouteCollection routes, string name, string url);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
这里有个特殊的语法 this RouteCollection routes, 这个是C# 3.0加入的东西,叫扩展方法,具体可以看我转的博文 。
我们可以看到MVC中自动生成的路由是用的第二个重载。
namespaces,看名字是指定namespace的,怎么用的还不知道。
但是constraints的用法,我知道了,是添加约束的,如
routes.MapRoute(
"Product",
"Product/{productId}",
new {controller="Product", action="Details"},
new {productId = @"/d+" }
);
上面这个是,用正则指定了productId 必须是至少一位的数字。
再看下面的例子:
routes.MapRoute(
"Blog", // Route name
"Archive/{entryDate}", // URL with parameters
new { controller = "Archive", action = "Entry" } // Parameter defaults
);
这个例子是在URL中中只出现Controller名字,但是在内部总是使用指定action的例子。
其实根据这个constraints是可以自定义的。
文件:LocalhostConstraint.cs
using System.Web;
using System.Web.Routing;
namespace MvcApplication1.Constraints
{
public class LocalhostConstraint : IRouteConstraint
{
public bool Match (
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
{
return httpContext.Request.IsLocal;
}
}
}
------------------------
routes.MapRoute(
"Admin",
"Admin/{action}",
new {controller="Admin"},
new {isLocal=new LocalhostConstraint()}
);
这个限制admin的操作只允许在本地进行。