RouteBase.GetRouteData 如何工作或实现模式匹配的指针

2023-12-03

我正在考虑实现一个选项来定义我的 HttpModule 将忽略的特定 URL 模式。

我希望能够定义“过滤器”,例如:

/Admin/{*}
/Products/{*}/Search

它应该过滤掉如下网址:

http://mysite.com/admin/options
http://mysite.com/products/toys/search

但不过滤掉http://mysite.com/orders http://mysite.com/products/view/1

与 ASP.NET MVC 注册与模式匹配的路由的方式非常相似。 我查看了 Phil Haack 的 Route Debugger 的源代码,认为它可能会向我展示 RouteBase.GetRouteData(..) 的工作原理,但它只是利用它。

我似乎找不到任何示例来说明此 RouteBase.GetRouteData 实际上如何工作(或找到它的实际源代码)。

如果有人能为我指出正确的方向(或模式匹配)通常是如何实现的,那就太好了。

P.S:我已经知道我可以使用正则表达式,但希望有一个非常具体的规则集。


Update

因为您想编写一个非常接近地模仿工作的 HttpModuleSystem.Web.Routing是,那么也许你应该使用ILSpy并反映大会并看看它做了什么?

原答案(为后代保留)

目前尚不清楚您是在谈论 ASP.NET MVC 还是 Spring MVC 或者 Spring.NET 对 ASP.NET MVC 的扩展。如果是第一个或第三个:

对于你的第一个例子:

Admin/{*}

下面的解决方案#1 将解决这个问题。对于第二个例子:

Products/{*}/Search,解决方案 #2 将解决这个问题(如果需要验证或实际上有一些有效的东西)

两种解决方案是:

  1. 创建接受这些参数的路由(但不对它们执行任何操作,或者不关心它们)
  2. 创建一个 ActionFilter 来检查这些参数的请求(来自路由),然后将它们替换为实际应该存在的内容。

解决方案1

在您的路线部分global.asax.cs:

routes.MapRoute("AdminAnything",
    "Admin/{*anything}",
    new { controller = admin, action = "Show" }
    );

这将导致以下 URL 解析为管理控制器中的“显示”操作(从而根据需要忽略输入):

Admin/Options  
Admin/Anything-I-Want-here

解决方案2

现在,第二个更棘手,因为实际上中间有一些东西。

输入示例:

Product/{*}/Search  

您可以编写一个 ActionFilter 来拦截请求,查看它,并将该值替换为您想要的任何值。

一、必要路线:

routes.MapRoute("ProductSearch",
    "Products/{searchType}/Search,
    new { controller = "Products", action = "Search" }
    );

然后你的控制器动作:

public ActionResult Search(string searchType)
{
    //do nothing with searchType here.
}

如果您想实际用某些东西替换它,您可以在视图中发送一个隐藏的表单字段,并在 Actionfilter 中处理它:

public class SearchValidationActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if(filterContext.ActionParameters.ContainsKey("searchType") && filterContext.HttpContext.Request.Headers["hiddenSearchType"].IsNotNullOrEmpty()))
        {
        var actualSearchType = filterContext.ActionParameters["hiddenSearchType"] as SearchType;
        var searchType = filterContext.ActionParameters["searchType"];
        if (actualSearchType != null)
        {
            if (searchType.IsNullOrEmpty())
        {
            filterContext.Result = new SearchRedirectResult(actualSearchType.Name);
        }
        else if (!actualSearchType.Name.Equals(searchType))
        {
            filterContext.Result = new SearchRedirectResult(actualSearchType.Name,);
        }
        }
    }
        base.OnActionExecuting(filterContext);
    }
}

基本上,解决方案#2 接受任何内容,并根据隐藏的搜索类型将其传递给实际的搜索类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RouteBase.GetRouteData 如何工作或实现模式匹配的指针 的相关文章

随机推荐