有两种方法可以解决此问题:
正则表达式约束,如下所示:MVC Route Attribute error on two different routes
或自定义路由约束,如下所示:https ://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/
您可以通过实现 IRouteConstraint 接口来创建自定义路由约束。例如,以下约束将参数限制为一组有效值:
public class ValuesConstraint : IRouteConstraint
{
private readonly string[] validOptions;
public ValuesConstraint(string options)
{
validOptions = options.Split('|');
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
object value;
if (values.TryGetValue(parameterName, out value) && value != null)
{
return validOptions.Contains(value.ToString(), StringComparer.OrdinalIgnoreCase);
}
return false;
}
}
以下代码显示了如何注册约束:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var constraintsResolver = new DefaultInlineConstraintResolver();
constraintsResolver.ConstraintMap.Add("values", typeof(ValuesConstraint));
routes.MapMvcAttributeRoutes(constraintsResolver);
}
}
现在您可以在路线中应用约束:
public class TemperatureController : Controller
{
// eg: temp/celsius and /temp/fahrenheit but not /temp/kelvin
[Route("temp/{scale:values(celsius|fahrenheit)}")]
public ActionResult Show(string scale)
{
return Content("scale is " + scale);
}
}
在我看来,这不是很好的设计。除非您自己明确设置它们,否则在匹配时不会判断您想要什么 URL,也没有特定规则。但至少你可以让你的 URL 看起来像你想要的那样。希望您的约束列表不会太长。如果是,或者您不想对路由字符串参数及其约束进行硬编码,您可以在操作方法之外以编程方式构建它,并将其作为变量提供给 Route 属性。