9

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

public ActionResult Details(int id)
{
    // do something
}

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

我正在尝试做的是提供不同的类型,例如:

public enum MyEnum
{
    All,
    Pending,
    Complete
}

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

public ActionResult MyMethod(MyEnum myEnum = MyEnum.Pending)
{
    // do something
}

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

要指定一个不同的论点,我必须这样做http://localhost:port/Controller/MyMethod?myEnum=All并且有效。

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

在尝试这样做时,我得到一个可以理解的异常,但为什么in404不会发生这种情况?idDetails

我可以更改MapRoutewhich is current:url: "{controller}/{action}/{id}"以允许我用自己的类型实现它吗?

到目前为止我已经尝试过:

我只希望对我的一个方案进行这种路由强制,例如http://localhost:port/Controller/MyMethod/{ViewType},我尝试了这个,但它似乎没有做任何事情:

routes.MapRoute(
    "MyRoute",
    "MyController/Index/{MyEnum}",
    new { controller = "MyController", action = "Pending" }
);
4

2 回答 2

11

/Controller/MyMethod/All实际上会起作用。问题在于默认路由,它将被视为All路由id参数,它与您的操作用作参数的内容不一致。如果您的操作签名是:它实际上会正常工作:

public ActionResult MyMethod(MyEnum id = MyEnum.Pending)

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

可以为此用例添加另一条路线,但您需要注意不要只是创建另一个“默认”路线,它将接管。换句话说,您必须修复部分 URL:

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 }
 );

然后,仅通过/Controller/路由前缀的存在,它将使用您的自定义路由,并填写All参数myEnum,而不是点击默认路由并尝试填写id.

但是,请注意,当使用枚举作为路由参数时,它们必须是完全匹配的。所以,虽然/Controller/MyMethod/All会起作用,但/Controller/MyMethod/all不会。为了解决这个问题,您必须创建一个自定义模型绑定器。我进行了快速搜索,发现以下文章可能会在这方面对您有所帮助。

于 2017-02-15T16:45:38.350 回答
2

你确实可以。不要更改默认路由"{controller}/{action}/{id}",而是在默认路由前添加一个。这个新的需要相当具体:

routes.MapRoute(
    "EnumRoute",
    "Controller/MyMethod/{myEnum}",
    new { controller = "Controller", action = "MyMethod", myEnum = UrlParameter.Optional }
);

基本上说的是“当您看到对 Controller/MyMethod/whatever 的请求时,请使用此控制器和该方法并将任何内容作为请求的参数传递”。请注意,实际控制器不一定必须是 url 中所说的路由,尽管坚持这一点是个好主意。

于 2017-02-15T16:36:34.753 回答