控制器映射中的ASP.NET MVC枚举参数

Tob*_*oby 6 c# asp.net asp.net-mvc routeconfig

ASP.NET MVC为控制器方法提供了简单的模板,例如Details,可以有类似的东西:

public ActionResult Details(int id)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式访问: http://localhost:port/Controller/Details/id

我想要做的是提供不同的类型,如:

public enum MyEnum
{
    All,
    Pending,
    Complete
}
Run Code Online (Sandbox Code Playgroud)

然后我设置我的控制器方法,如:

public ActionResult MyMethod(MyEnum myEnum = MyEnum.Pending)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

这适用于:http://localhost:port/Controller/MyMethod/因为它使用默认参数.

要指定一个不同的参数,我必须做http://localhost:port/Controller/MyMethod?myEnum=All,这是有效的.

我想知道,我可以做http://localhost:port/Controller/MyMethod/All而不是使用?myEnum=All吗?

当试图那样做,我得到一个404例外,这是可以理解,但为什么没有出现这种情况的idDetails

我可以更改MapRoute当前的内容:url: "{controller}/{action}/{id}"允许我使用自己的类型实现它吗?

到目前为止我尝试过的:

我只希望这个路线执行我的一个方案,例如http://localhost:port/Controller/MyMethod/{ViewType},我试过这个但它似乎没有做任何事情:

routes.MapRoute(
    "MyRoute",
    "MyController/Index/{MyEnum}",
    new { controller = "MyController", action = "Pending" }
);
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 7

/Controller/MyMethod/All实际上会有效.问题是与默认路由,这会考虑Allid路由参数,不与你的动作作为参数,排队.如果你的行动签名是:它实际上会正常工作:

public ActionResult MyMethod(MyEnum id = MyEnum.Pending)
Run Code Online (Sandbox Code Playgroud)

因为它会绑定All到正确的东西.

可以为此用例添加另一个路由,但是您需要注意不要只创建另一个"默认"路由,它将接管.换句话说,您必须修复部分网址:

routes.MapRoute(
    "MyCustomRoute",
    "Controller/{action}/{myEnum}",
    new { controller = "Controller", action = "MyMethod", myEnum = MyEnum.Pending }
);

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
 );
Run Code Online (Sandbox Code Playgroud)

然后,由仅仅出现/Controller/前缀的路由,所以会使用自定义路由,而不是,并填写AllmyEnumPARAM,而不是击中缺省路由,并尽量填写id.

但是,请注意,当使用枚举作为路线参数时,它们必须是精确匹配.所以,虽然/Controller/MyMethod/All会起作用,但/Controller/MyMethod/all不会.要解决这个问题,您必须创建一个自定义模型绑定器.我做了一个快速搜索,发现以下文章可以帮助你.