1

假设我在 Global.asax 中有一个与此类似的路由声明:

RouteTable.Routes.MapPageRoute("Products", "products/{productno}/{color}", "~/mypage.aspx");

如何配置路由,使其仅在{productno}有效 Guid 且{color}为整数值时才拦截请求?

  • 确定网址:/products/2C764E60-1D62-4DDF-B93E-524E9DB079AC/123
  • 无效的网址:/products/xxx/123

无效的 url 将被另一个规则/路由拾取或完全忽略。

4

2 回答 2

2

RouteConstraint您可以通过实现匹配规则来编写自己的。例如,这是一个确保路由参数是有效日期的方法:

public class DateTimeRouteConstraint : IRouteConstraint
{
    public bool Match(System.Web.HttpContextBase httpContext, Route route, 
        string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        DateTime dateTime;
        return DateTime.TryParse(values[parameterName] as string, out dateTime);
    }
}

然后您可以通过更改路由定义来强制执行它(这是针对 MVC 2.0):

routes.MapRoute(
    "Edit",
    "Edit/{effectiveDate}",
    new { controller = "Edit", action = "Index" },
    new { effectiveDate = new Namespace.Mvc.DateTimeRouteConstraint() }
);

这里还有一些资源:

  1. 如何创建 System.Guid 类型的路由约束?
  2. http://prideparrot.com/blog/archive/2012/3/creating_custom_route_constraints_in_asp_net_mvc
于 2012-09-17T13:41:18.493 回答
1

除了创建您自己RouteConstraint的标准路由系统外,它还支持标准语法中的 RegEx 路由约束。就像是:

string guidRegex = @"^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$";
string intRegex = @"^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$";

routes.MapRoute(
  "Products",
  "products/{productno}/{color}",
  new { controller = "Products", action = "Index" },
  new { productno = guidRegex, color = intRegex }
);
于 2012-09-17T13:51:38.513 回答