将URL转换为控制器/操作对
作者:互联网
在.Net MVC中,您将路由定义到RouteCollection中. URL帮助器方法可以轻松地将控制器操作的可选参数转换为URL.
当.Net MVC处理来自客户端浏览器的请求时,它将清楚地将此URL映射到正确的控制器操作,以执行适当的命令.
但是,我看不到一种以编程方式即时访问此路由的方法,因此我可以将完全限定的URL(或1万个URL列表)转化为其路由组件.
有谁知道你会怎样,例如,以下字符串输入:
"https://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}->控制器:问题,行动:问题,但这不是面向未来的,也不是很有趣,它依赖于文本操作/处理.
给定一个路由字典和一个URL列表,并具有如上所述的功能,您可以查看哪个控制器受到的打击最大,或哪些动作等等.
解决方法:
您应该看一下创建自己的MvcRouteHandler的过程.这是MVC堆栈中的路由引擎已经解析URL来查找要调用的Controller和Action的点,然后它通过此方法来获取实际的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();
标签:url-routing,c,asp-net-mvc 来源: https://codeday.me/bug/20191111/2020218.html