asp.net mvc正则表达式路由v约束

时间:2012-01-20 05:17:55

标签: regex asp.net-mvc-3 routing

我是否认为正则表达式路线已被路线限制所取代?

互联网上没有关于通过正则表达式进行路由的信息?似乎在v1之前有一些帖子,但从那时起我就没有任何帖子,而且我已经使用约束实现了相同的目标。

1 个答案:

答案 0 :(得分:1)

RegEx路由已废弃,处理此问题的首选方法是通过路径限制。

RegEx Routes面临的挑战之一是能够使用Url Helpers / Action Links为您的网页生成正确的网址。

我确信您找到的信息是关于MVC Beta的讨论。

public class RegexRoute : Route
{
    private readonly Regex _urlRegex;

    public RegexRoute(string urlPattern, IRouteHandler routeHandler)
        : this(urlPattern, null, routeHandler)
    {}

    public RegexRoute(string urlPattern, RouteValueDictionary defaults, IRouteHandler routeHandler)
        : base(null, defaults, routeHandler)
    {
        _urlRegex = new Regex(urlPattern, RegexOptions.Compiled);
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        string requestUrl = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;

        Match match = _urlRegex.Match(requestUrl);

        RouteData data = null;

        if(match.Success)
        {
            data = new RouteData(this, this.RouteHandler);

            // add defaults first
            if (null != this.Defaults)
            {
                foreach (KeyValuePair<string, object> def in this.Defaults)
                {
                    data.Values[def.Key] = def.Value;
                }
            }

            // iterate matching groups
            for (int i = 1; i < match.Groups.Count; i++)
            {
                Group group = match.Groups[i];

                if (group.Success)
                {
                    string key = _urlRegex.GroupNameFromNumber(i);

                    if (!String.IsNullOrEmpty(key) && !Char.IsNumber(key, 0)) // only consider named groups
                    {
                        data.Values[key] = group.Value;
                    }
                }
            }
        }

        return data;
    }
}

顺便说一下,将路径定义为正则表达式的一个很好的“副作用”是它允许我们就地执行验证,这种渲染不需要约束的概念。

这是一个定义为正则表达式的快速示例路由:

routes.Add(new RegexRoute(@"^Books/((?<ssn>[\d]{3}(-?)[\d]{2}\1[\d]{4})|(?<query>.+)?)$", new MvcRouteHandler())
   {
       Defaults = new RouteValueDictionary(new { controller = "Book", action = "Find" })
   });

现在上面的路线可能,也可能应该分成两条不同的路线;一个用于查找SSN的书籍,另一个用于搜索书籍,但我想展示使用正则表达式所获得的灵活性。通过上述路线,像“mysite.com/Books/Last+Argument+Of+Kings”和“mysite.com/Books/0575077905”这样的网址都映射到BookController类的Find动作,并初始化了相应的参数: / p>

public class BookController : Controller
{
    public void Find(string query, int? ssn)
    {
        // ... gets the book by ssn if present, otherwise searches using the query
    }
}
来自http://www.iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx

http://web.archive.org/web/20110227054359/http://www.iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx来自