在ASP .NET MVC 3中使用子域路由生成URL

时间:2011-11-07 15:16:13

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

在ASP.NET MVC中有很多关于子域路由的材料。其中一些使用区域作为子域的目标,其他使用另一个控制器。

其中有一些:

Subdomains for a single application with ASP.NET MVC

Asp.Net MVC 2 Routing SubDomains to Areas

MVC 3 Subdomain Routing

MVC-Subdomain-Routing on Github

他们都解释了如何接受和路由子域的请求。

可是:

  1. 他们都没有解释如何使用子域生成网址。即我尝试了@Html.RouteLink("link to SubDomain", "SubdomainRouteName"),但它忽略了子域并生成了没有它的网址

  2. 如何处理来自不同区域的相同控制器名称。所有这些解决方案(他们使用名称空间用于这些目的)抛出存在多个控制器的异常并建议使用名称空间:)

  3. 目的: 使用子域名创建移动版网站

1 个答案:

答案 0 :(得分:0)

I've wrote a post关于如何在我的应用程序中使用子域路由。源代码可以在帖子上找到,但我会尝试解释我是如何使用自定义RouteLink方法的。

帮助方法使用RouteTable类根据当前的Url获取Route对象,并将其强制转换为SubdomainRoute对象。

在我的情况下,所有路由都是使用SubdomainRoute定义的,每次我需要添加链接到其他页面我使用自定义RouteLink助手时,这就是为什么我认为这个强制转换是安全的。使用SubdomainRoute变量,我可以获取子域名,然后使用UriBuilder类构建Url。

这是我目前正在使用的代码。

public static IHtmlString AdvRouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, object routeValues, object htmlAttributes)
{
    RouteValueDictionary routeValueDict = new RouteValueDictionary(routeValues);
    var request = htmlHelper.ViewContext.RequestContext.HttpContext.Request;
    string host = request.IsLocal ? request.Headers["Host"] : request.Url.Host;
    if (host.IndexOf(":") >= 0)
        host = host.Substring(0, host.IndexOf(":"));

    string url = UrlHelper.GenerateUrl(routeName, null, null, routeValueDict, RouteTable.Routes, htmlHelper.ViewContext.RequestContext, false);
    var virtualPathData = RouteTable.Routes.GetVirtualPathForArea(htmlHelper.ViewContext.RequestContext, routeName, routeValueDict);

    var route = virtualPathData.Route as SubdomainRoute;

    string actualSubdomain = SubdomainRoute.GetSubdomain(host);
    if (!string.IsNullOrEmpty(actualSubdomain))
        host = host.Substring(host.IndexOf(".") + 1);

    if (!string.IsNullOrEmpty(route.Subdomain))
        host = string.Concat(route.Subdomain, ".", host);
    else
        host = host.Substring(host.IndexOf(".") + 1);

    UriBuilder builder = new UriBuilder(request.Url.Scheme, host, 80, url);

    if (request.IsLocal)
        builder.Port = request.Url.Port;

    url = builder.Uri.ToString();

    return htmlHelper.Link(linkText, url, htmlAttributes);
}

private static IHtmlString Link(this HtmlHelper htmlHelper, string text, string url, object htmlAttributes)
{
    TagBuilder tag = new TagBuilder("a");
    tag.Attributes.Add("href", url);
    tag.InnerHtml = text;
    tag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}