ResolveUrl / ResolveClientUrl эквиваленты для Asp.Net Razor? - PullRequest
24 голосов
/ 16 февраля 2011

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

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

Так что, в принципе, я хочу либо эквивалент 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 эквивалент?

Ответы [ 3 ]

35 голосов
/ 17 февраля 2011

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

@Href("../../site.css")
1 голос
/ 06 октября 2013

Если вы шаг за шагом конвертируете приложение 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 classic и ASP.NET MVC.

0 голосов
/ 24 сентября 2015

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

var imgUrl = '@Href("~/images/calendar.png")'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...