【问题标题】:Relative Content Path in MVC3 AreasMVC3 区域中的相对内容路径
【发布时间】:2011-02-26 22:47:47
【问题描述】:

我发现了这个问题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 + "/"));
      }

    }
 }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-areas


    【解决方案1】:

    我个人喜欢扩展方法路由,基于我想出的第一个答案并测试它是否有效......而不是使用@Url.Content,使用@Url.ContentArea,无需输入'~/' , '/' 或 '../' 等。

    助手会做一些检查来自动删除这些,所以就像这样使用......

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

    当您创建此 Url Helper Extension 时,您可以选择,但我在 Web 根目录下创建了一个“Helpers”文件夹,然后我将 @using YourWebNameSpace.Helpers; 包含在我的 _Layout.cshtml(剃刀/母版页)中的任何“区域”中我进去了。

    您仍然可以将@Url.Content 用于当前区域之外的引用(基本上您可以根据所需资源及其位置进行混合)。

    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>
    

    【讨论】:

      【解决方案2】:

      您可以尝试在 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="..." />
      

      我没有尝试代码,如果我错了,请纠正我。

      【讨论】:

      • 我喜欢这个解决方案。不过,我想知道什么更快:检查模块中的路径或字典查找,然后检查。尽管如此,这可以通过各种技巧进行优化。
      • 另一个好处是,上述问题中提供的解决方案不允许引用该区域外的资产,因为它总是会尝试重新写入可能不需要的区域。跨度>
      【解决方案3】:

      我为一些图像尝试了上面的 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】:

        我刚刚在样式表中遇到了类似的问题,我通过放入两个相对路径来解决:

        #searchbox {
            ...
            background: url("../Content/magglass.png") no-repeat;
            background: url("../../Content/magglass.png") no-repeat;
            ...
        }
        

        【讨论】:

          【解决方案5】:

          我的 ASP.NET MVC 3 Web 应用程序遇到了类似的问题,我将其修复为写作而不是

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

          这个:

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

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

          【讨论】:

          • 它在区域内不起作用。它指向根并忽略它是在一个区域内启动的事实。
          猜你喜欢
          • 1970-01-01
          • 2011-11-30
          • 2011-08-18
          • 2011-07-29
          • 2012-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-13
          相关资源
          最近更新 更多