Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NETMVC3中使用子域路由生成URL_Asp.net Mvc_Asp.net Mvc 3_Subdomain_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 在ASP.NETMVC3中使用子域路由生成URL

Asp.net mvc 在ASP.NETMVC3中使用子域路由生成URL,asp.net-mvc,asp.net-mvc-3,subdomain,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 3,Subdomain,Asp.net Mvc Routing,在ASP.NET MVC中有很多关于子域路由的资料。其中一些使用区域作为子域的目标,另一些使用其他控制器 其中有一些: 它们都解释了如何接受和路由子域请求 但是: 它们都没有解释如何使用子域生成URL。也就是说,我尝试了@Html.RouteLink(“链接到子域”,“子域路由名称”),但它忽略了子域并生成了没有子域的url 如何处理来自不同区域的控制器的相同名称。所有这些解决方案(它们使用名称空间实现这些目的)都会引发存在多个控制器的异常,并建议使用名称空间:) 目的: 使用子域创建站

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

其中有一些:

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

但是:

  • 它们都没有解释如何使用子域生成URL。也就是说,我尝试了
    @Html.RouteLink(“链接到子域”,“子域路由名称”)
    ,但它忽略了子域并生成了没有子域的url

  • 如何处理来自不同区域的控制器的相同名称。所有这些解决方案(它们使用名称空间实现这些目的)都会引发存在多个控制器的异常,并建议使用名称空间:)

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

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

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

    在我的例子中,所有路径都是使用子域名路由定义的,每次我需要添加一个链接到其他页面,我使用我的自定义例程帮助器,这就是为什么我认为这个转换是安全的。有了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));
    }
    

    @非即时存档帖子链接: