Asp.net mvc 有没有更好的方法来区分路由中的字符串id参数和操作名称?

Asp.net mvc 有没有更好的方法来区分路由中的字符串id参数和操作名称?,asp.net-mvc,asp.net-mvc-routing,url-routing,Asp.net Mvc,Asp.net Mvc Routing,Url Routing,问题 我有一个带有标准CRUD操作的TagsController。但是对于详细信息结果,我不希望在url中包含操作名称。我想要这样的URL: 标签 标记/my标记url//未指定操作名称 标记/创建 标签/编辑/123 。。。和往常一样 但显然,路由无法区分动作名称和my tag url参数 可能的解决方案1 创建2条路线。一个用于标记/{my tag url}路由,另一个用于标记/{action}/{id}路由 缺点:使用约束装饰其中一条路由的要求-检查数据库中是否存在my tag ur

问题

我有一个带有标准CRUD操作的
TagsController
。但是对于
详细信息
结果,我不希望在url中包含操作名称。我想要这样的URL:

  • 标签
  • 标记/my标记url//未指定操作名称
  • 标记/创建
  • 标签/编辑/123
  • 。。。和往常一样
但显然,路由无法区分动作名称和
my tag url
参数


可能的解决方案1

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

缺点:使用约束装饰其中一条路由的要求-检查数据库中是否存在
my tag url
,或检查控制器上的操作名称列表。
(顺便说一句——这两种方法中有一种比另一种更可取吗?)


可能的解决方案2

tags/my tag url
更改为
tag/my tag url
(注意单数),并将其映射到不同的控制器

缺点:URL不再是“可黑客”的。我不能仅仅删除
我的标记url
就进入列出所有标记的索引页面

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

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

使用约束装饰其中一条管线的要求-或 检查数据库中是否存在我的标记url,或检查 针对控制器上的操作名称列表

您已经给自己设置了一个
情况,但您也可以(最好)使用regex选项,因此无需查找:

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}
不是“index,other,which”时才使用此路由

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

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

使用约束装饰其中一条管线的要求-或 检查数据库中是否存在我的标记url,或检查 针对控制器上的操作名称列表

您已经给自己设置了一个
情况,但您也可以(最好)使用regex选项,因此无需查找:

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}
不是“index,other,which”时才使用此路由谢谢。这就是我最后采取的方法。我有一个约束,它检查TagsController上的(缓存的)操作列表。谢谢。这就是我最后采取的方法。我有一个约束,它检查TagsController上的(缓存的)操作列表。