Ответ 1
Вы можете попробовать использовать WebPageRenderingBase.Href метод, подобный этому
@Href("../../site.css")
Итак, я начал использовать синтаксис <%: 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?
Вы можете попробовать использовать WebPageRenderingBase.Href метод, подобный этому
@Href("../../site.css")
Если вы конвертируете приложение 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.
Обычно я делаю это в своем javascript-коде.
var imgUrl = '@Href("~/images/calendar.png")'