Подтвердить что ты не робот

ResolveUrl/ResolveClientUrl эквивалент для Asp.Net Razor?

Итак, я начал использовать синтаксис <%: Url.Content(~/site/blah) %> как стандарт для CSS, JScript и URL-адресов изображений - действительно решает множество проблем; и это, по крайней мере, совместимо с страницами WebForms и Razor (не все мои разработчики будут делать Razor, и все же они все равно будут работать на этой платформе, которую я выпустил).

Тем не менее, для того, что я делаю в данный момент, я мог бы действительно сделать способ, чтобы взять относительный Url, написанный на странице Razor, и во время выполнения разрешить его правильному файлу на стороне сервера, прежде чем включать его обратно в абсолютный URL для клиента. Url.Content ничего не делает с относительными Urls.

Итак, в основном, я хочу либо эквивалент ResolveUrl, либо ResolveClientUrl на уровне Razor.

Я хотел бы, чтобы это позволило использовать пути доступа (и более толерантные к переименованию) в некоторых моих 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")

И эта работа, конечно, независимо от того, сколько путей существует в текущем маршруте запроса.

Конечно, я могу заставить это работать в WebForms, если я удалю вызов Url.Content и просто полагаюсь на перезагрузку URL.

Есть ли какой-либо эквивалент в Razor?

4b9b3361

Ответ 1

Вы можете попробовать использовать WebPageRenderingBase.Href метод, подобный этому

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

Ответ 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);
    }
}

Вы можете ResolveClientUrlPageWrapper с классической страницы ASP.NET или ResolveClientUrlHttpServerUtilityBaseWrapper с контроллера ASP.NET MVC, ResolveClientUrlUrlHelperWrapper из ASP.NET MVC View. У вас будет одинаковый код фона по всему классу ASP.NET и ASP.NET MVC.

Ответ 3

Обычно я делаю это в своем javascript-коде.

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