懒惰的mvc.net路由

时间:2014-08-27 06:59:02

标签: asp.net-mvc asp.net-mvc-routing

我不确定这是否可行或之前有过询问,但我找不到任何与之相关的内容。

我有一系列使用标准路线格式的路线:

/{controller}/{action}/{id}/

我网站的90%将采用此格式,但“id”会发生很大变化,例如

/{controller}/{action}/{clientid}

/{controller}/{action}/{questionnaireid}

等等。但我很懒,作为一个优秀的程序员应该是,而且每次我有一个新的参数名称时我都不想创建一个新的路由。

我尝试过参数绑定,来自另一个堆栈溢出问题但是我不得不将视图中的参数命名为错误的东西,例如。

@Url.Action("users", "clients", new { id = Model.Client.ID })

并且BindParameter将id绑定到clientID,以便我的代码正确读取。但我不想拥有这个“id = Model.Client.ID”。它需要是“clientID = Model.Client.ID”,因为我喜欢我的代码始终保持一致,不需要写评论来说明发生了什么以及为什么 - 我宁愿代码可读。

因此可以使用正则表达式

/{controller}/{action}/{([a-z0-9]{0,255})}/

这样一条路由就会绑定到{id}或{clientID}。如果我不能,我不能,我会克服它,但我会很棒。希望你能帮忙。

修改 这与参数的值无关,而与action方法的参数名称有关。我基本上不希望有50多条路由只是动作上的参数名称不同。

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确找到了你需要的东西,但你可能在MapRoute的constraints属性中有一些reglar表达式:

routes.MapRoute(
    name: "clientRoute",
    url: "{controller}/{action}/{clientid}",
    defaults: ...,
    constraints: new {clientid=@"[a-z0-9]"}
);
routes.MapRoute(
    name: "plainIdRoute",
    url: "{controller}/{action}/{id}",
    defaults: ...,
    constraints: new {id=@"{0,255}"}
);

我没有检查正则表达式的有效性。

你还需要记住,如果一个id匹配两个规则,那么它将获得第一个,所以你应该确保你没有重叠。