sintaxis net mvc cshtml asp asp.net asp.net-mvc razor

asp.net - net - razor reference



ResolveUrl/ResolveClientUrl equivalentes para Asp.Net Razor? (3)

Generalmente lo hago de esta manera en mi código de JavaScript.

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

Así que comencé a usar la <%: Url.Content(~/site/blah) %> como estándar para las URL de CSS, JScript e Image: resuelve muchos problemas; y al menos es consistente entre las páginas de WebForms y Razor (no todos mis desarrolladores harán Razor, y aun así seguirán trabajando en esta plataforma que he producido).

Sin embargo, por algo que estoy haciendo en este momento, podría hacer una manera de tomar una URL relativa escrita en una página Razor y, en tiempo de ejecución, resolverla en el archivo correcto del lado del servidor, antes de volver a convertirla en una Url absoluta para el cliente. Url.Content no hace nada con las Urls relativas.

Entonces, básicamente, quiero un equivalente de ResolveUrl o ResolveClientUrl en el nivel Razor.

Me gustaría que esto habilite rutas de recursos terser (y más tolerante a cambiar el nombre) en algunas de mis vistas MVC, que pueden estar a unas pocas carpetas más abajo de la raíz, y cuya carpeta de contenido se expresaría más fácilmente como una ruta relativa, por lo Podría tener:

folder/folder/views/shared/layout.cshtml
y
folder/folder/content/site.css

(También deduje el uso de una página de diseño para reflejar el tipo de problemas abordados por ResolveUrl y la reformulación que hace WebForms)

Al usar Url.Content tal como está, necesitaría especificar la ruta completa:

Url.Content("~/folder/folder/content/site.css")

Pero lo que me gustaría es

Url.Content("../../site.css")

Y tenga ese trabajo, por supuesto, independientemente de cuántas rutas haya en la ruta de la solicitud actual.

Por supuesto, puedo hacer que esto funcione en WebForms, si abandono la llamada Url.Content y solo confío en el rebase de URL.

¿Hay algún equivalente en Razor?



Si está convirtiendo la aplicación ASP.NET ASP.NET MVC paso a paso, puede usar wrappers:

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); } }

Puede ResolveClientUrlPageWrapper desde la página ASP.NET clásica o ResolveClientUrlHttpServerUtilityBaseWrapper desde el controlador ASP.NET MVC, ResolveClientUrlUrlHelperWrapper desde ASP.NET MVC View. Tendrás el mismo código de fondo en toda la aplicación ASP.NET classic y ASP.NET MVC.