ASP.NET MVC 3 решил эту проблему, и как Алекс Форд вывел , вы можете использовать \d*
вместо написания пользовательского ограничения. Если ваш шаблон более сложный, например, поиск года с \d{4}
, просто убедитесь, что ваш шаблон соответствует вашему желанию, а также пустой строке, такой как (\d{4})?
или \d{4}|^$
. Все, что делает тебя счастливым.
Если вы все еще используете ASP.NET MVC 2 и хотите использовать Пример Марка Белла или Пример NYCChris , имейте в виду, что маршрут будет совпадать, пока URL-адрес параметр содержит совпадение с вашим шаблоном. Это означает, что шаблон \d+
будет соответствовать параметрам, таким как abc123def
. Чтобы избежать этого, оберните шаблон с ^(
и )$
либо при определении ваших маршрутов, либо в пользовательском ограничении. (Если вы посмотрите на System.Web.Routing.Route.ProcessConstraint в Reflector , вы увидите, что он делает это для вас при использовании встроенного ограничения. Он также устанавливает Параметры CultureInvariant, Compiled и IgnoreCase .)
Поскольку я уже написал свое собственное пользовательское ограничение с поведением по умолчанию, упомянутым выше, прежде чем понять, что мне не нужно его использовать, я оставлю это здесь:
public class OptionalConstraint : IRouteConstraint
{
public OptionalConstraint(Regex regex)
{
this.Regex = regex;
}
public OptionalConstraint(string pattern) :
this(new Regex("^(" + pattern + ")$",
RegexOptions.CultureInvariant |
RegexOptions.Compiled |
RegexOptions.IgnoreCase)) { }
public Regex Regex { get; set; }
public bool Match(HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection)
{
if(routeDirection == RouteDirection.IncomingRequest)
{
object value = values[parameterName];
if(value == UrlParameter.Optional)
return true;
if(this.Regex.IsMatch(value.ToString()))
return true;
}
return false;
}
}
А вот пример маршрута:
routes.MapRoute("PostsByDate",
"{year}/{month}",
new { controller = "Posts",
action = "ByDate",
month = UrlParameter.Optional },
new { year = @"\d{4}",
month = new OptionalConstraint(@"\d\d") });