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
?
尝试这样做时,我得到了404
异常,这是可以理解的,但是为什么Details
中的id
不会发生这种情况?
我可以更改当前是:url: "{controller}/{action}/{id}"
的MapRoute
,以允许我使用自己的类型实现它?
到目前为止我尝试过的内容:
我只想要http://localhost:port/Controller/MyMethod/{ViewType}
等我的一项方案的该路线执行,我尝试过,但它似乎没有做任何事情:
routes.MapRoute(
"MyRoute",
"MyController/Index/{MyEnum}",
new { controller = "MyController", action = "Pending" }
);
/Controller/MyMethod/All
实际上会起作用。问题在于默认路由,该路由将All
视为id
路由参数,该参数与您的操作用作参数的内容不符。如果您的动作签名是:
public ActionResult MyMethod(MyEnum id = MyEnum.Pending)
因为它将将All
绑定到正确的事物。
you 可以为此用例添加另一条路由,但是您需要小心,不要仅仅创建另一个"默认"路由,这将接管。换句话说,您必须修复部分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
将无法。为了解决这个问题,您必须创建一个自定义模型粘合剂。我进行了快速搜索,并找到了以下文章,这可能会对您有所帮助。
您确实可以。请勿更改默认路由"{controller}/{action}/{id}"
,而是在默认情况下添加一个。这个新的需要相当具体:
routes.MapRoute(
"EnumRoute",
"Controller/MyMethod/{myEnum}",
new { controller = "Controller", action = "MyMethod", myEnum = UrlParameter.Optional }
);
基本上说的是"当您看到对字面上的控制器/myMethod/erthing请求时,请使用此控制器和该方法,然后将任何请求的参数传递"。请注意,实际控制器不必是路线在URL中所说的,尽管坚持这是一个好主意。