Asp.net mvc ASP.NET MVC:可用路由数据的Uri
我的问题很简单。我有一个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转到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是绝对的。。。否则就完了。