首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ASP .NET MVC 3中使用子域路由生成URL

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

Stack Overflow用户
提问于 2011-11-07 15:16:12
回答 1查看 3.4K关注 0票数 1

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

其中有一些是:

具有ASP.NET MVC的单个应用程序的子域

Asp.Net MVC 2将SubDomains路由到区域

MVC 3子域路由

MVC-子域路由在Github上的应用

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

但是:

  1. 它们都没有解释如何生成带有子域的URL。例如,我尝试了@Html.RouteLink("link to SubDomain", "SubdomainRouteName"),但是它忽略了子域并生成没有它的url。
  2. 如何处理来自不同地区的控制器的相同名称。所有这些解决方案(为此使用名称空间)都抛出存在多个控制器的异常,并建议使用名称空间:)

用途:使用子域创建站点的移动版本

EN

回答 1

Stack Overflow用户

发布于 2011-11-17 14:56:35

关于如何在应用程序中使用子域路由的我写了一篇文章。文章中提供了源代码,但我将尝试解释我是如何实现自定义RouteLink方法的。

helper方法使用RouteTable类获取基于当前Url的Route对象,并将其转换为SubdomainRoute对象。

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

这是我目前使用的代码。

代码语言:javascript
运行
复制
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));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8038466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档