问题
我有一个TagsController
,标准的CRUD操作。但对于Details
结果,我宁愿不在网址中包含操作名称。我想要这样的网址:
但很明显,路由无法区分动作名称和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
以进入列出所有标记的索引页面。
答案 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);
时才使用此路由“索引,其他,无论什么”