【问题标题】:Generate URL using Subdomain routing in ASP .NET MVC 3在 ASP .NET MVC 3 中使用子域路由生成 URL
【发布时间】:2023-03-31 16:52:01
【问题描述】:

有很多关于 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. 他们都没有解释如何生成带有子域的 URL。 IE。我尝试了@Html.RouteLink("link to SubDomain", "SubdomainRouteName"),但它忽略了子域并在没有它的情况下生成 url

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

目的: 使用子域创建网站的移动版本

【问题讨论】:

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


    【解决方案1】:

    I've wrote a post 关于我如何在我的应用程序中使用子域路由。源代码在帖子中提供,但我将尝试解释我是如何实现自定义 RouteLink 方法的。

    helper 方法使用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));
    }
    

    【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2015-08-04
    • 2011-07-23
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多