c# - 将 URL 转换为 Controller / Action 对

标签 c# asp.net-mvc url-routing

在 .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/

相关文章:

c# - 用C#实现Hoey Shamos算法

c# - 为什么 Setter 属性不适用于超链接?

asp.net-mvc - 创建 asp.net MVC 和 WCF 服务应用程序的建议方法

c# - LESS 到 CSS 的转换是在客户端还是在服务器端完成的?

php - 从子目录飞行 PHP 路由

javascript - 使用 Angular UI 路由器 $stateProvider 在状态上声明主 Controller

c# - WPF - 任务栏通知球

c# - 是否有充分的理由在非静态类中使用静态方法?

c# - 如何防止验证器在 HttpGet 上运行?

Django - 使用 {% url %} 生成的链接 - 如何使它们安全?