有没有更好的方法来区分我的路由中的字符串id参数和动作名称?

时间:2015-10-24 13:26:18

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

问题

我有一个TagsController,标准的CRUD操作。但对于Details结果,我宁愿不在网址中包含操作名称。我想要这样的网址:

  • 标记
  • tags / my-tag-url //未指定操作名称
  • 标签/创建
  • 标记/编辑/ 123
  • ......和平常一样......

但很明显,路由无法区分动作名称和my-tag-url参数。

可能的解决方案1 ​​

创建2条路线。一个用于tags/{my-tag-url}路由,另一个用于tags/{action}/{id}路由。

下行:要求使用约束来装饰其中一条路线 - 要么检查数据库中my-tag-url的存在,要么检查上面的操作名称列表控制器。
(顺便说一句 - 这两种情况要么优先于其他?)

可能的解决方案2

tags/my-tag-url更改为tag/my-tag-url(注意单数)并将其映射到其他控制器。

下行:网址不再“黑客”。我不能只删除my-tag-url以进入列出所有标记的索引页面。

1 个答案:

答案 0 :(得分:0)

  

但显然,路由无法区分   动作名称和my-tag-url参数。

约束是实现这一目标的手段。

  

要求用约束装饰其中一条路线 - 要么   在DB中检查my-tag-url的existsince,或者检查   对照控制器上的动作名称列表。

你给自己一个either-or的情况,但你也可以(最好)使用正则表达式选项,所以不需要查找:

routes.MapRoute("blog", "{year}/{month}/{day}"
, new {controller="blog", action="index"}
, new {year=@"\d{4}", month=@"\d{2}", day=@"\d{2}"});

在你的情况下:

routes.MapRoute("tagurl", "{tagurl}"
    , new {controller="tags", action="TagRedirector"}
    , new {tagurl=@"@"^htt\w*"});


public ActionResult TagRedirector(string tagurl)
{
..
}

然而,这可能会遇到危险的请求区域,所以如果你的标签没有模式(www.)?你可以过滤掉那么你可以在你的正则表达式模式中轻松使用!运算符来敲除控制器上应该被过滤掉的动作方法的名称,即只有在{tagsurl}不是 var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 时才使用此路由“索引,其他,无论什么”