Создание URL-адреса с использованием маршрутизации субдомена в ASP .NET MVC 3 - PullRequest
1 голос
/ 07 ноября 2011

В ASP.NET MVC написано много материалов о маршрутизации поддоменов. Некоторые из них используют области в качестве цели для поддоменов, другие используют другие контроллеры.

Вот некоторые из них:

Поддомены для одного приложения с ASP.NET MVC

Asp.Net MVC 2 Маршрутизация дочерних доменов к областям

Маршрутизация поддоменов MVC 3

MVC-Поддомены-Маршрутизация на Github

Они все объясняют, как принимать и направлять запросы с поддоменом.

Но:

  1. Никто из них не объясняет, как создавать URL-адреса с поддоменом. То есть Я пытался @Html.RouteLink("link to SubDomain", "SubdomainRouteName"), но что он игнорирует поддомен и генерирует URL без него

  2. Как бороться с одинаковыми именами контроллеров из разных областей. Все эти решения (для этих целей они используют пространства имен) выдают исключения, которые существуют в нескольких контроллерах, и предлагают использовать пространства имен:)

Назначение: создать мобильную версию сайта, используя поддомен

1 Ответ

0 голосов
/ 17 ноября 2011

Я написал пост о том, как я использую маршрутизацию субдоменов в своем приложении. Исходный код доступен в посте, но я постараюсь объяснить, как я сделал свой собственный метод RouteLink.

Вспомогательный метод использует класс RouteTable, чтобы получить объект Route на основе текущего URL-адреса и привести его к объекту SubdomainRoute.

В моем случае все маршруты определяются с использованием SubdomainRoute, и каждый раз, когда мне нужно добавить ссылку на какую-то другую страницу, я использую свой собственный помощник RouteLink, поэтому я считаю это приведение безопасным. С доступной переменной SubdomainRoute я могу получить имя субдомена и затем построить URL-адрес, используя класс UriBuilder.

Это код, который я сейчас использую.

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));
}
...