从RouteBase.GetVirtualPath返回绝对路径

时间:2014-09-22 11:50:42

标签: asp.net asp.net-mvc

public class CustomRoute : RouteBase
{
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary routeValues)
    {
        var virtual_path_data = new VirtualPathData( this, "http://example.com" );

        return virtual_path_data;
    }
}

ASP.NET自动似乎在从VirtualPathData返回的任何(绝对)路径中添加一个前导斜杠,在此示例中返回/http://example.com

问题:

  • 是否可以通过RouteBase系统生成绝对URL?
  • 如果不是:什么是最不丑的黑客,所以它适用于Url.ActionRedirectToAction以及我不知道的其他用例。

背景

我已经编写了一个基于XML的路由引擎,它支持多个域名。因此,当我生成仅在其他域上可用的网址时,我想生成一个绝对网址,包括域名。

<host name="exm.com" controller="ShortUrl">
    <parameter name="code" action="Redirect" />
</host>  

<host name="*" default="example.com" controller="Home" action="Index">
    <x name="demo" controller="Home" action="Demo" />
    <x name="comments" controller="Comment" action="List">
        <x name="write" action="Write" />
        <x name="delete" action="Delete" />
    <x>
</host>

产生如下组合:

Url.Action("Demo", "Home")

http://example.com/demo

Url.Action("Write", "Comment")

http://example.com/comments/write

Url.Action("Redirect", "ShortUrl", new { code = "gH8x" } )

http://exm.cm/gH8x

请注意,example.com和exm.com都指的是相同的应用程序IP,并在应用程序中路由。

2 个答案:

答案 0 :(得分:0)

这是一篇关于某人的博文,似乎有关于你正在尝试做什么的说明。 MVC Domain Routing

答案 1 :(得分:0)

最后,我做了一个相对丑陋的黑客,我用一个特殊字符作为前缀,以确定它是否应该是一个绝对的URL。

public static string HostAction(this UrlHelper url, string actionName, string controllerName, object routeValues = null, bool forceOrigin = false)
{
    var route_value_dictionary = CloneRouteValues( routeValues );

    // this is being used in the routing to determine
    // if they need to route for an absolute URL
    route_value_dictionary.Add( "routeWithHostName", true );

    // if forceOrigin is false, then the Routing will not return 
    // an absolute path if it's not necessary (url relative to the current domain)
    route_value_dictionary.Add("forceOrigin", forceOrigin );

    var path = url.Action( actionName, controllerName, route_value_dictionary );

    if ( path.Length < 2 )
        return path;

    // starts with /$ ? then this is an absolute URL. Strip the first two characters
    if ( path[1] == '$' )
        return path.Substring( 2 );
    else
        return path;
}

绝对不理想,但直到现在我似乎还没有太多的东西一直在打破它。