代码之家  ›  专栏  ›  技术社区  ›  Adam Chubbuck

将Url.Content(“~”)设置为区域[duplicate]的根目录

  •  0
  • Adam Chubbuck  · 技术社区  · 7 年前

    我发现了这个问题 Can't use relative paths with areas in ASP.NET MVC 2 我也有同样的问题。MVC3还是这样吗?

    这样一个区域中的布局文件

    不必做一个完全限定的链接,需要区域目录和区域名称,或者解决上面的问题,这需要对每个请求的每个区域进行检查。

    我决定同时使用上面问题中的解决方案和下面的解决方案(html助手),具体取决于项目/情况。我的上述实现使用app.setting来存储区域名称和扩展名,这样我就可以将模块作为库的一部分。

    var context = HttpContext.Current;
    var path = context.Request.Path;
    var list = ...       //code that gets from app.config and then saves it
    var extensions = ... // to the cache as non-removable with a dependency on web.config
    foreach (var area in list)
    {
       if (!path.Contains(area + "/")) continue;
       foreach (var extension in extensions)
       {
          if (path.EndsWith("." + extension))
          {
             context.RewritePath(path.Replace(area + "/", "Areas/" + area + "/"));
          }
    
        }
     }
    
    0 回复  |  直到 9 年前
        1
  •  4
  •   Eduardo Campañó    15 年前

    您可以尝试在HtmlHelper上创建一个扩展来解决这个问题:

    public static string Image(this HtmlHelper html, string imagePath)
    {
        var area = html.ViewContext.RouteData.Values["area"];
        if (!string.IsNullOrEmpty(area))
            area = "Areas/" + area + "/";
        return VirtualPathUtility.ToAbsolute("~/" + area + "Content/img/" + imagePath);
    }
    

    <img src="@Html.Image("myimage.png")" alt="..." />
    

    我没试过密码,所以如果我错了就纠正我。

        2
  •  18
  •   Dan Atkinson    12 年前

    我个人喜欢扩展方法路线,基于我提出的第一个答案,并测试了它的工作原理。。。而不是使用 @Url.Content ,使用 @Url.ContentArea

    助手会做一些检查来自动删除这些,所以使用如下。。。

    @Url.ContentArea("Content/style.css") or @Url.ContentArea("Images/someimage.png") :)
    

    当你创建这个Url助手扩展,你的选择,但我创建了一个'助手'文件夹的根网站,然后我包括 @using YourWebNameSpace.Helpers; _Layout.cshtml (剃刀/母版)在我所在的任何“区域”。

    你还可以用 @Url.内容 对于当前区域以外的引用(基本上可以根据所需资源及其位置进行混合)。

    namespace YourWebNamespace.Helpers
    {
        public static class UrlHelperExtensions
        {
            public static string ContentArea(this UrlHelper url, string path)
            {
                var area = url.RequestContext.RouteData.DataTokens["area"];
    
                if (area != null)
                {
                    if (!string.IsNullOrEmpty(area.ToString()))
                        area = "Areas/" + area;
    
                    // Simple checks for '~/' and '/' at the
                    // beginning of the path.
                    if (path.StartsWith("~/"))
                        path = path.Remove(0, 2);
    
                    if (path.StartsWith("/"))
                        path = path.Remove(0, 1);
    
                    path = path.Replace("../", string.Empty);
    
                    return VirtualPathUtility.ToAbsolute("~/" + area + "/" + path);
                }
    
                return string.Empty;
            }
        }
    }
    

    在母版页或任何页面中(仅此示例中使用Razor)。。。

    @using YourWebNamespace.Helpers
    
    <html lang="en">
    <head>
    
        <link href="@Url.ContentArea("Content/reset.css")" media="screen" rel="stylesheet" type="text/css" />
    
        <link href="@Url.ContentArea("Content/style.css")" media="screen" rel="stylesheet" type="text/css" />
    
    </head>
    <body>
    
        3
  •  1
  •   n8nt    15 年前

    我尝试了上面的UrlHelperExtensions,以获取一些图像,这些图像在我的母版页中用作jQuery滚动横幅的数据。我必须添加以下else子句,以便助手在没有区域时返回路径:

            else
            {
                if (path.StartsWith(@"~/"))
                {
                    var result = VirtualPathUtility.ToAbsolute(path);
                    return result;
                }
            }
    
            return string.Empty;
    

    在我的视图页面中,我使用了:

    <img src="@Url.ContentArea("~/images/ScrollPicture1.png")" alt="Gallery picture 1" />
    

    感谢您发布此解决方案。很适合我的图像修复。

        4
  •  1
  •   user1227068    14 年前

    我只是在一个样式表中遇到了一个类似的问题,我只需输入两个相对路径就可以解决这个问题:

    #searchbox {
        ...
        background: url("../Content/magglass.png") no-repeat;
        background: url("../../Content/magglass.png") no-repeat;
        ...
    }
    
        5
  •  -1
  •   Stefano    15 年前

    我的ASP.NETMVC3Web应用程序也有类似的问题,我用编写而不是修改它

    <img src="mypath/myimage.png" alt="my alt text" />
    

    这是:

    <img src='@Url.Content("mylink")' alt="my alt text" />
    

    其中最后一个mylink是类似于~/mypath的路径。我用它来链接我的javascript文件,但我没有尝试它与图像或链接,所以你应该试试自己。。。