Asp.net mvc ASP.NET MVC:可用路由数据的Uri

Asp.net mvc ASP.NET MVC:可用路由数据的Uri,asp.net-mvc,routing,asp.net-mvc-routing,Asp.net Mvc,Routing,Asp.net Mvc Routing,我的问题很简单。我有一个Uri,我想知道它映射到哪个路由,这样我就可以对路由的各个部分进行一些检查:控制器、操作等等 如何从Uri转到RoutedData或Route?您可以尝试扩展HttpRequestBase并重写Uri属性,以便可以将Uri分配给请求的属性。然后重写HttpContextBase以允许您在上下文上设置请求属性。然后可以在RouteCollection类上使用GetRouteData()方法来获取合适的RouteValueDictionary。请注意,RouteCollect

我的问题很简单。我有一个Uri,我想知道它映射到哪个路由,这样我就可以对路由的各个部分进行一些检查:控制器、操作等等


如何从Uri转到RoutedData或Route?

您可以尝试扩展HttpRequestBase并重写Uri属性,以便可以将Uri分配给请求的属性。然后重写HttpContextBase以允许您在上下文上设置请求属性。然后可以在RouteCollection类上使用GetRouteData()方法来获取合适的RouteValueDictionary。请注意,RouteCollection作为RouteTable类的静态属性可用

var myRequest = new MyRequest( myUri );
var myContext = new MyContext( myRequest );
var routeData = RouteTable.Routes.GetRouteData( myContext );
更新

对于您的用例(注释),您可以简单地匹配控制器/操作:

if (myUri.ToString().ToLower().Contains( "/controller/action" ))
{
     return RedirectToAction( action, controller, new { ...route data } );
}
else
{
     return Redirect( "http://www.example.com/default" );
}

根据@tvanfosson的指导,我想出了一个能满足我需要的课程。请注意,
getRoutedData
实际上查看的是
RequestContextBase
类上的
AppRelativeCurrentExecutionFilePath
PathInfo
属性,而不是
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; } }
    }
}

根据您是否同意更改当前请求的路径(在我的情况下,我是),这里有一个非常简单的解决方案,不需要模拟任何内容:

HttpContext httpContext = HttpContext.Current;
httpContext.RewritePath(URL);
RouteData route = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));

我从来没有真正需要在框架处理它时执行它。您的用例到底是什么?我要处理的只是一个Uri,如果该Uri满足某些条件,我需要重定向(映射到具有特定操作的特定控制器),否则重定向到默认Uri。如何简单地匹配Uri中的字符串“controller/action”,而不是将其解析为路由数据?我将用一个例子来更新。我不喜欢像这样硬编码URL值,而对于另一个,在某些情况下,条件可能不仅仅是控制器和操作。我已经让它工作了。。。我会把结果贴在下面+1感谢您的帮助。注意:这可能需要一些额外的检查,以确保Uri是绝对的。。。否则就完了。