Asp.Net Razor的ResolveUrl / ResolveClientUrl等价物?

时间:2011-02-16 17:59:41

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

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

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

所以,基本上,我想要在Razor级别上等效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 rebasing。

Razor中是否有任何等效物?

3 个答案:

答案 0 :(得分:35)

您可以尝试使用{/ 3}}这样的方法

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

答案 1 :(得分:1)

如果要逐步转换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 View获取ResolveClientUrlUrlHelperWrapper。您将在整个ASP.NET经典和ASP.NET MVC应用程序中使用相同的后台代码。

答案 2 :(得分:0)

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

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