在 .Net MVC 中,您将路由定义到 RouteCollection
中。 URL 帮助器方法可以轻松地将 controller
+ action
+ optional params
转换为 URL。
当 .Net MVC 处理来自客户端浏览器的请求时,它明确地将此 URL 映射到正确的 controller
+ action
,以执行适当的命令。
但是,我看不到以编程方式动态访问此路由的方法,这样我就可以将完全限定的 URL(或 10k+ URL 的列表)转换为它的路由组件。
有谁知道你会如何转换,例如,下面的字符串input:
"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
,并且您想计算出哪些实际的端点/ Action / Controller 正在以编程方式被击中(而不用太在意传递的实际数据)。
您可以手动编码映射,这样您就知道/questions/{id}/{text}
-> controller: questions, action: question
,但这不是面向 future 的,也不是有趣的,并且依赖于文本操作/处理。
给定一个路由字典和一个 URL 列表,以及一个如上所述的函数,您可以查看哪些 Controller 被命中最多,或者哪些操作等。
最佳答案
您应该看看如何创建自己的 MvcRouteHandler .这是 MVC 堆栈中的一点,路由引擎已经解析了 URL 以找到要调用的 Controller 和操作,然后通过此方法获取要调用的实际 C# 类和方法。尚未应用授权甚至 HTTP Verb,因此您将看到对您的应用程序进行的每个调用。
public class CustomRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext context)
{
var controller = context.RouteData.Values["controller"];
var action = context.RouteData.Values["action"];
// Do whatever logging you want with this data, maybe grab the other params too.
return base.GetHttpHandler(context);
}
}
这可以很容易地在您设置路由的地方注册。
routes.MapRoute("Home", "{controller}/{action}", new
{
controller = "Home",
action = "Index"
})
.RouteHandler = new CustomRouteHandler();
关于c# - 将 URL 转换为 Controller / Action 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392615/