【发布时间】:2017-04-13 12:40:40
【问题描述】:
在 .Net MVC 中,您将路由定义为 RouteCollection。 URL 帮助器方法可以轻松地将 controller + action + optional params 转换为 URL。
.Net MVC 处理来自客户端浏览器的请求时,它清楚地将这个 URL 映射到右边的controller + action,以执行相应的命令。
但是,我看不到以编程方式即时访问此路由的方法,因此我可以将完全限定的 URL(或 10k+ URL 的列表)转换为其路由组件。
有谁知道你会怎么转,例如,下面的字符串输入:
"http://stackoverflow.com/questions/2342325/c-sharp-net-mvc-turning-url-into-controller-action-pair"
进入以下输出:
{
controller: "questions",
action: "view",
id: 2342325,
seoText: "c-sharp-net-mvc-turning-url-into-controller-action-pair"
}
鉴于此映射显然是由 .Net 完成的,它是否暴露在任何地方?
为什么有人要这样做?
假设你有一个你知道已经被访问过的 URL 列表,本质上大多是动态的,例如 stackoverflow.com/questions/2342325/c-sharp-net-mvc-turning-url-into-controller-action-pair,并且你想知道哪些实际的端点/动作/控制器正在以编程方式被命中(不太关心传递的实际数据)。
您可以手动进行代码映射,这样您就知道/questions/{id}/{text} -> controller: questions, action: question,但这不是面向未来的,也不是很有趣,并且依赖于文本操作/处理。
给定一个路由字典和一个 URL 列表,使用上述功能,您可以查看哪些控制器最受打击,或者哪些操作等。
【问题讨论】:
-
不清楚为什么要这样做,但您可以使用
Uri uri = new Uri("http://stackoverflow.com/questions/ask");并检查其Segments属性 -
@StephenMuecke - 在问题中添加了“为什么”。但我认为这些段只会告诉你 URL 段,而不关心被调用的实际控制器/动作。
-
在您的示例中,
Segments[0]将返回“问题”,Segments[1]将返回"ask",但如果您没有为方法。 -
@StephenMuecke 我将更新示例,以便更清楚我的要求。
-
您的要求在技术上不可行。 URL 仅与特定路由或路由集一起具有意义,这些路由或路由集决定了 URL 的解析方式以及初始化的控制器和操作。例如,我可以有一个将 URL“/foo/”映射到
MyAwesomeController.MyAwesomeAction的路由。在这种情况下,您绝对不可能只查看 URL 字符串并知道将调用什么控制器和操作。
标签: c# asp.net-mvc url-routing