【发布时间】:2016-05-06 08:43:03
【问题描述】:
我正在将 ASP.NET MVC 4 项目升级到 MVC 5,并希望使用属性路由而不是约定路由。到目前为止,一切都很好,但是我在填充 Defaults RouteValueDictionary 时遇到了一个问题。这如何通过属性路由来实现?
我对同一个动作使用多个路由,每个路由都传递一个不同的枚举值来确定动作是哪种类型。枚举的值不会直接在路由中可见!这很重要,否则我可以在路由模板中使用枚举参数的值。
我的简化控制器动作:
public class MyController : Controller
{
public ActionResult MyAction(MyType myTypeValue)
{
// ...
}
}
public enum MyType
{
FirstOption,
SecondOption
}
我的旧会议路线:
routes.Add("First", new Route("a-route", new { controller = "MyController", action = "MyAction", myTypeValue = MyType.FirstOption }));
routes.Add("Second", new Route("a-total/different-route", new { controller = "MyController", action = "MyAction", myTypeValue = MyType.Second }));
通过属性路由,我期望使用这样的东西:
Route["a-route", new { myTypeValue = MyType.FirstOption }]
Route["a-total/different-route", new { myTypeValue = MyType.SecondOption }]
但不幸的是,这并不存在。我试图制作一个自定义的RouteAttribute,它接受一个对象来填充DefaultsRouteValueDictionary:
public class MyRouteAttribute : RouteFactoryAttribute
{
private RouteValueDictionary _defaults;
public Route(string template, object defaults)
:base(template)
{
_defaults = new RouteValueDictionary(defaults);
}
public override RouteValueDictionary Defaults
{
get { return _defaults; }
}
}
但这不起作用,因为路由属性无法处理匿名类型的编译时间。
有没有人知道如何让这个工作以一种或另一种方式工作?
“只做两个不同的动作”在这里不是一个选项。
【问题讨论】:
标签: c# asp.net-mvc enums asp.net-mvc-routing attributerouting