我想用这些URL到达Bikes控制器:
/bikes // (default path for US)
/ca/bikes // (path for Canada)
Run Code Online (Sandbox Code Playgroud)
实现这一目标的一种方法是每个Action使用多个Route Attributes:
[Route("bikes")]
[Route("{country}/bikes")]
public ActionResult Index()
Run Code Online (Sandbox Code Playgroud)
为了保持DRY,我更喜欢使用RoutePrefix,但不允许使用多个Route Prefix:
[RoutePrefix("bikes")]
[RoutePrefix("{country}/bikes")] // <-- Error: Duplicate 'RoutePrefix' attribute
public class BikesController : BaseController
[Route("")]
public ActionResult Index()
Run Code Online (Sandbox Code Playgroud)
我试过使用这个Route Prefix:
[RoutePrefix("{country}/bikes")]
public class BikesController : BaseController
Run Code Online (Sandbox Code Playgroud)
结果:/ ca / bikes工作,/自行车404s.
我试过让国家选择:
[RoutePrefix("{country?}/bikes")]
public class BikesController : BaseController
Run Code Online (Sandbox Code Playgroud)
相同的结果:/ ca / bikes工作,/自行车404s.
我试过给国家一个默认值:
[RoutePrefix("{country=us}/bikes")]
public class BikesController : BaseController
Run Code Online (Sandbox Code Playgroud)
相同的结果:/ ca / bikes工作,/自行车404s.
有没有其他方法可以使用属性路由实现我的目标? (是的,我知道我可以通过在RouteConfig.cs中注册路由来完成这些工作,但这不是我在这里寻找的东西).
我正在使用Microsoft.AspNet.Mvc 5.2.2.
仅供参考:这些是简化示例 - 实际代码具有{country}值的IRouteConstraint,例如:
[Route("{country:countrycode}/bikes")]
Run Code Online (Sandbox Code Playgroud) 我在MVC 5中使用属性路由,但我开始注意到一点痛点.我有一种情况,我想继承控制器,因为所有的动作都会做同样的事情.但是,我显然需要为子类的操作使用不同的路由.现在,我正在做类似于:
public class FooController : Controller
{
[Route("foo", Name = "Foo")]
public virtual ActionResult Foo()
{
...
return View();
}
}
public class BarController : FooController
{
[Route("bar", Name = "Bar")]
public override ActionResult Foo()
{
return base.Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很糟糕.我不是重复实际操作方法的代码(在某些情况下是相当多的),至少,但这对我来说感觉不对.此外,在基本操作方法定义由于某种原因而发生变化的情况下,这会成为一种维护噩梦.通常,我是否有某些方法可以在不必覆盖方法的情况下更改属性?也许,某些属性特定于路由.或者我只是运气不好?