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



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/的前缀存在该路由的前缀,它将使用您的自定义路由,然后填写AllmyEnum参数,而不是击中默认路由并尝试填充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中所说的,尽管坚持这是一个好主意。

相关内容

  • 没有找到相关文章

最新更新