¿Cómo resolver el problema con la ruta de imagen al probar htmlhelper?
-
26-09-2019 - |
Pregunta
Encontré un problema cuando estaba probando mi ayudante HTML. Básicamente, estoy creando una cuadrícula con cargas de filas, columnas y diferentes tipos de datos. En el encabezado también hay una imagen para notificar al usuario por qué columna están ordenados los datos. Sin embargo, cuando escribo mi prueba ahora (demasiado tarde, pero ¿más tarde que nunca, ¿verdad?), Recibo este error:
"La aplicación Virtual Rath '~/Images/SortingRowup.png' no se puede hacer absoluta, porque la ruta a la aplicación no se conoce".
var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png");
Como puedo resolver esto. Puedo entender cómo esto podría ser un problema durante la prueba, y la imagen podría no estar disponible y todo eso, pero ¿cuál es la forma correcta de hacer esto entonces?
Solución
La forma correcta es llamar UrlHelper.GenerateContentUrl
en vez de VirtualPathUtility
. En su código de ayuda, haría algo como esto:
MvcHtmlString MyHelper(this HtmlHelper helper, ...) {
// other code
var imgPath = UrlHelper.GenerateContentUrl("~/Images/SortingArrowUp.png",
helper.ViewContext.HttpContext);
// other code
}
Cuando pruebe unidades, tendrá que pasar en objetos de contexto correctamente burlados. Necesitas burlarse HttpContext.Request.ApplicationPath
- Devuelve una ruta de aplicación ficticia, HttpContext.Response.ApplyAppPathModifier()
- hacer nada, HttpContext.Request.ServerVariables
- Return Null, HttpContext.Request.Path
y HttpContext.Request.RawUrl
- Devuelva algún valor que tenga sentido.
Otros consejos
Puedes usar esta sobrecarga:
var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png",
context.Request.ApplicationPath);
Esto es lo que UrlHelper.GenerateContentUrl
usa internamente, y solo necesitas burlarse ApplicationPath
.