ASP.NET MVC:Uri 到可用的路由数据

mke*_*bbs 5 asp.net-mvc routing asp.net-mvc-routing

我的问题很简单。我有一个 Uri,我想弄清楚它映射到哪条路由,以便我可以对路由的各个部分进行一些检查:控制器、动作等。

如何从 Uri 转到 RouteData 或 Route?

mke*_*bbs 4

根据@tvanfosson 的指导,我想出了一个可以满足我需要的课程。请注意,GetRouteData实际上查看的是类的AppRelativeCurrentExecutionFilePathPathInfo属性RequestContextBase,而不是Url属性。

public class RouteInfo
{
    public RouteInfo(RouteData data)
    {
        RouteData = data;
    }

    public RouteInfo(Uri uri, string applicationPath)
    {
        RouteData = RouteTable.Routes.GetRouteData(new InternalHttpContext(uri, applicationPath));            
    }

    public RouteData RouteData { get; private set; }

    //********************
    //Miscellaneous properties here to deal with routing conditionals... (e.g. "CanRedirectFromSignIn")
    //********************

    private class InternalHttpContext : HttpContextBase
    {
        private HttpRequestBase _request;

        public InternalHttpContext(Uri uri, string applicationPath) : base()
        {
            _request = new InternalRequestContext(uri, applicationPath);
        }

        public override HttpRequestBase Request { get { return _request; } }
    }

    private class InternalRequestContext : HttpRequestBase
    {
        private string _appRelativePath;
        private string _pathInfo;

        public InternalRequestContext(Uri uri, string applicationPath) : base()
        {
            _pathInfo = uri.Query;

            if (String.IsNullOrEmpty(applicationPath) || !uri.AbsolutePath.StartsWith(applicationPath, StringComparison.OrdinalIgnoreCase))
            {
                _appRelativePath = uri.AbsolutePath.Substring(applicationPath.Length);
            }
            else
            {
                _appRelativePath = uri.AbsolutePath;
            }
        }

        public override string AppRelativeCurrentExecutionFilePath { get { return String.Concat("~", _appRelativePath); } }
        public override string PathInfo { get { return _pathInfo; } }
    }
}
Run Code Online (Sandbox Code Playgroud)