2011-02-16 69 views
24

因此,我开始使用<%: Url.Content(~/site/blah) %>语法作为CSS,JScript和图像URL的标准 - 确实解决了很多问题;它至少在WebForms和Razor页面之间保持一致(并不是所有的开发人员都会使用Razor,但他们仍然会在我制作的这个平台上工作)。Asp.Net Razor的ResolveUrl/ResolveClientUrl等价物?

但是,对于我目前正在做的事情,我可以通过一种方式将一个相对Url写入Razor页面,并在运行时将其解析为正确的服务器端文件,然后再转向它返回到客户端的绝对Url。 Url.Content不会对相关网址做任何事情。

所以,基本上,我希望在剃刀水平上有相当于ResolveUrlResolveClientUrl

我希望能够在我的一些MVC视图中启用terser(并且更容忍重命名)资源路径,这些视图可以是从根目录开始的几个文件夹,其内容文件夹将更容易表达为相对路径 - 这样我就可以有:

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")

而且有工作,当然,不管当前请求路径中有多少路径。

当然,我可以得到这个在WebForms中工作,如果我沟通Url.Content调用,只是依靠url重定位。

剃须刀有什么等价物吗?

回答

34

你可以尝试使用类似这样的

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

有趣的是,还没有机会尝试它,但我在离开工作前经历了代码,它似乎会这样做。他们使用了asp.net中的假控件实例。我刚刚完成了一个涉及表单和剃须刀的新页面基础并替换UrlHelper对象的解决方案(我需要为我的默认设置一致的方法,因为我也正在重新命名css和图像链接)。我会把它作为另一个答案发布,但是+1,谢谢 – 2011-02-17 14:36:34

1

WebPageRenderingBase.Href方法如果你一步转换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); 
    } 
} 

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

0

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

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