【问题标题】:ResolveUrl/ResolveClientUrl equivalents for Asp.Net Razor?Asp.Net Razor 的 ResolveUrl/ResolveClientUrl 等效项?
【发布时间】:2011-06-28 13:27:12
【问题描述】:

所以我开始使用 <%: Url.Content(~/site/blah) %> 语法作为 CSS、JScript 和图像 URL 的标准 - 确实解决了很多问题;并且至少在 WebForms 和 Razor 页面之间是一致的(并非我的所有开发人员都会使用 Razor,但他们仍将在我制作的这个平台上工作)。

但是,对于我目前正在做的事情,我真的可以用一种方法来获取写在 Razor 页面中的相对 URL,并在运行时将其解析为正确的服务器端文件,然后再打开它回到客户端的绝对网址。 Url.Content 对相对 URL 没有任何作用。

所以,基本上,我想要 Razor 级别的 ResolveUrlResolveClientUrl

我希望这样可以在我的一些 MVC 视图中启用更简洁(并且对重命名更宽容)的资源路径,这些视图可以是离根目录更远的几个文件夹,并且其内容文件夹更容易表示为相对路径 - 所以我可以:

folder\folder\views\shared\layout.cshtml

folder\folder\content\site.css

(我还推断使用布局页面来反映 ResolveUrl 解决的问题类型以及 WebForms 所做的重新定位)

按原样使用Url.Content,我需要指定完整路径:

Url.Content("~/folder/folder/content/site.css")

但我想要的是

Url.Content("../../site.css")

当然,不管当前请求的路径中有多少条路径,都要让它工作。

当然,如果我放弃 Url.Content 调用并仅依赖 url rebase,我可以让它在 WebForms 中工作。

Razor 中是否有任何等价物?

【问题讨论】:

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


    【解决方案1】:

    我通常在我的 javascript 代码中这样做。

    var imgUrl = '@Href("~/images/calendar.png")'
    

    【讨论】:

      【解决方案2】:

      如果您是逐步转换 ASP.NET 应用程序 ASP.NET MVC,则可以使用包装器:

      public abstract class ResolveClientUrlWrapper
      {
          public abstract string ResolveClientUrl(string relativeUrl);
      }
      
      public class ResolveClientUrlPageWrapper : ResolveClientUrlWrapper
      {
          System.Web.UI.Page _page;
      
          public ResolveClientUrlPageWrapper(System.Web.UI.Page page)
          {
                  _page = page;
          }
      
          public override string ResolveClientUrl(string relativeUrl)
          {
              return _page.ResolveClientUrl(relativeUrl);
          }
      }
      
      public class ResolveClientUrlPWebPageRenderingBaseWrapper : ResolveClientUrlWrapper
      {
          WebPageRenderingBase _webPageRenderingBase;
      
          public ResolveClientUrlPWebPageRenderingBaseWrapper(WebPageRenderingBase webPageRenderingBase)
          {
              _webPageRenderingBase = webPageRenderingBase;
          }
      
          public override string ResolveClientUrl(string relativeUrl)
          {
              return _webPageRenderingBase.Href(relativeUrl);
          }
      }
      
      public class ResolveClientUrlUrlHelperWrapper : ResolveClientUrlWrapper
      {
          UrlHelper _urlHelper;
      
          public ResolveClientUrlUrlHelperWrapper(UrlHelper urlHelper)
          {
              _urlHelper = urlHelper;
          }
      
          public override string ResolveClientUrl(string relativeUrl)
          {
              return _urlHelper.Content(relativeUrl);
          }
      }
      
      public class PathUtilityWrapper : ResolveClientUrlWrapper
      {
          public override string ResolveClientUrl(string relativeUrl)
          {
              return VirtualPathUtility.ToAbsolute(relativeUrl);
          }
      }
      

      您可以从经典 ASP.NET 页面 ResolveClientUrlPageWrapper 或从 ASP.NET MVC 控制器 ResolveClientUrlHttpServerUtilityBaseWrapper ,从 ASP.NET MVC 视图 ResolveClientUrlUrlHelperWrapper。您将在整个 ASP.NET 经典应用程序和 ASP.NET MVC 应用程序中拥有相同的背景代码。

      【讨论】:

        【解决方案3】:

        你可以试试WebPageRenderingBase.Href这样的方法

        @Href("../../site.css")
        

        【讨论】:

        • 有趣,还没有机会尝试,但我在下班前浏览了代码,并且似乎可以做到。有趣的是,他们使用了来自 asp.net 的假控件实例。我刚刚完成了一个解决方案,该解决方案涉及表单和剃须刀的新页面库并替换 UrlHelper 对象(我需要对我的默认设置采用一致的方法,因为我也在重新命名 css 和图像链接)。我会将其作为另一个答案发布,但为此 +1,谢谢
        • “我的默认设置”是指“我的开发团队”。我在打电话,讨厌的拼写检查介入了!
        • 谢谢,让我省去了一些麻烦,试图弄清楚如何做到这一点。
        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 2020-08-16
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 2018-06-10
        • 2017-03-17
        • 1970-01-01
        相关资源
        最近更新 更多