c# - sintaxis - Extraño NullRefereneceException en Razor helper
sintaxis razor mvc 5 (5)
Acabo de tener un problema simular (mvc.net 4). Lo pasé de esta manera:
código de error:
<input name="ItemUID" type="hidden" value="@ItemUID" />
código de trabajo:
<input name="ItemUID" type="hidden" @("value=")"@ItemUID" />
Estoy usando Razor Helpers en una aplicación de formularios web de C #.
El siguiente código compila y presenta A-OK cuando se le llama:
@helper MemberListItem(string firstname, string lastname, string avatarUrl)
{
<li>
@firstname @lastname
@avatarUrl
</li>
}
Salida (dos llamadas al ayudante):
<li>Bryan Arnold ../../Resources/Images/Placeholders/generic-user-image.jpg</li>
<li>Doug Bland ../../Resources/Images/Placeholders/generic-user-image.jpg</li>
Pero cuando cambio el helper para que avatarUrl
se coloque en el atributo src
de una etiqueta img
, obtengo una NullReferenceException
en el primer nombre. Sí, la NullReferenceException
está en el primer nombre.
El siguiente código compila pero lanza un NRE cuando se le llama:
@helper MemberListItem(string firstname, string lastname, string avatarUrl)
{
<li>
@firstname @lastname
<img src="@avatarUrl"/>
</li>
}
Tenga en cuenta que no estoy cambiando nada además de la ubicación de @avatarUrl
en el ayudante.
¿Cómo consigo la imagen para mostrar?
Actualización 1: También he intentado envolver mi código img
en <text></text>
(en vano):
<li>
@firstname @lastname
<text>
<img src="@avatarUrl"/>
</text>
</li>
Actualización 2: Aquí está el error:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 11: {
Line 12: <li>
Line 13: @firstname @lastname
Line 14: <img src="@avatarUrl"/>
Line 15: </li>
Source File: RazorHelpers/Family.cshtml Line: 13
Actualización 3: olvidé mencionar que estoy definiendo el @helper en un archivo separado. Entonces, estoy llamando a ese ayudante desde una plantilla aspx como esta:
<%= @HelperFile.Helper(parameters).ToString() %>
Además, creo que @Luaan podría estar en algo. He intentado juguetear con ~
para establecer una relación relativa a mis archivos de imagen, pensando que Razor podría estar lanzando un NRE porque no puede ubicar el archivo. Parece que ninguna configuración con ~
funciona en mi proyecto.
Con una ruta de archivo estática:
Esto funciona:
<img src="/Resources/Images/Placeholders/generic-user-image.jpg"/>
Esto no lo hace (NullReferenceException):
<img src="~/Resources/Images/Placeholders/generic-user-image.jpg"/>
Con una ruta de archivo dinámico:
Esto no funciona (NullReferenceException):
<img src="@avatarUrl"/>
Tampoco esto (NullReferenceException):
<img src="~@avatarUrl"/>
Nota: El directorio de Resources
está en la raíz de mi sitio web.
Actualización 4:
Abandoné mi asistente original (el que se mencionó al principio de esta pregunta) y me fui con una plantilla ASPX pura debido a limitaciones de tiempo con mi proyecto. Sin embargo, estoy tratando de usar un ayudante de Razor para una característica diferente en esta aplicación y tengo el mismo problema que he descrito anteriormente.
Aquí hay un ayudante similar (código fuente y compilado). Se supone que el ayudante debe mostrar una lista de enlaces que permiten al usuario registrarse / iniciar sesión en mi aplicación utilizando varios proveedores de identidad (google, facebook, twitter, yahoo). La historia es la misma aquí; el asistente se ejecuta sin error cuando acabo de imprimir el img src, pero arroja una NullReferenceException cuando pongo el img src en una etiqueta real <img/>
.
Fuente:
@helper ListGroupGrid(IEnumerable<ExternalIdentityProvider> providers) {
<div>
@foreach(var provider in providers){
@provider.Name
<img src="@provider.IconUrl"/>
}
</div>
}
Código compilado (de archivos temporales de ASP.NET en c: / Windows):
#pragma checksum "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "46B0FEE2042706017F4AE53D4EA612F3E73EDF8B"
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18052
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ASP.RazorHelpers {
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Helpers;
using System.Web.Security;
using System.Web.UI;
using System.Web.WebPages;
using System.Web.WebPages.Html;
#line 1 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
using Aqha.DatabaseHelpers;
#line default
#line hidden
#line 2 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
using Aqha.RazorExtensions;
#line default
#line hidden
#line 3 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
using DevExpress.Utils.Drawing.Helpers;
#line default
#line hidden
public class IdentityProvider : System.Web.WebPages.HelperPage {
#line hidden
#line 5 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
public static System.Web.WebPages.HelperResult ListGroupGrid(IEnumerable<IdentityProviderData.ExternalIdentityProvider> providers) {
#line default
#line hidden
return new System.Web.WebPages.HelperResult(__razor_helper_writer => {
#line 5 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 202, 11, true);
WriteLiteralTo(__razor_helper_writer, " <div>/r/n");
EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 202, 11, true);
#line 7 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
#line default
#line hidden
#line 7 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
foreach(var provider in providers){
#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 272, 13, false);
#line 8 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
WriteTo(__razor_helper_writer, provider.Name);
#line default
#line hidden
EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 272, 13, false);
#line 8 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 287, 16, true);
WriteLiteralTo(__razor_helper_writer, " <img");
EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 287, 16, true);
WriteAttributeTo(__razor_helper_writer, "src", Tuple.Create(" src=/"", 303), Tuple.Create("/"", 326)
#line 9 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
, Tuple.Create(Tuple.Create("", 309), Tuple.Create<System.Object, System.Int32>(provider.IconUrl
#line default
#line hidden
, 309), false)
);
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 327, 4, true);
WriteLiteralTo(__razor_helper_writer, "/>/r/n");
EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 327, 4, true);
#line 10 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
}
#line default
#line hidden
BeginContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 342, 12, true);
WriteLiteralTo(__razor_helper_writer, " </div>/r/n");
EndContext(__razor_helper_writer, "~/App_Code/RazorHelpers/IdentityProvider.cshtml", 342, 12, true);
#line 12 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
#line default
#line hidden
});
#line 12 "C:/Users/Public/Documents/VisualStudioProjects/OnlineStable/Aqha/App_Code/RazorHelpers/IdentityProvider.cshtml"
}
#line default
#line hidden
public IdentityProvider() {
}
protected static ASP.global_asax ApplicationInstance {
get {
return ((ASP.global_asax)(Context.ApplicationInstance));
}
}
}
}
Actualización 5: hice algunas pruebas más. Para ilustrar el problema de la manera más clara posible, eliminé todos los parámetros de entrada y el marcado adicional.
Considere los siguientes tres ayudantes:
@helper BaseCase() {
<img src="/Resources/Images/Placeholders/generic-user-image.jpg"/>
}
@helper VariableBaseCase() {
var src = "/Resources/Images/Placeholders/generic-user-image.jpg";
<img src="/Resources/Images/Placeholders/generic-user-image.jpg"/>
<text>the source is @src</text>
}
@helper Variable() {
var src = "/Resources/Images/Placeholders/generic-user-image.jpg";
<img src="@src"/>
<text>the source is @src</text>
}
Cuando llamo a los dos primeros ayudantes desde un ASPX, muestran la salida (y las imágenes aparecen normalmente) sin excepción:
<%= RazorHelpers.ImageTest.BaseCase().ToString() %>
<%= RazorHelpers.ImageTest.VariableBaseCase().ToString() %>
Cuando llamo al último ayudante, recibo el mismo error que he recibido.
<%= RazorHelpers.ImageTest.Variable().ToString() %>
Espero ahora que estoy en lo cierto al creer que esto es, de alguna manera, un problema relativo al camino. ¿Cómo consigo que Razor muestre imágenes con propiedades src
dinámicas en mi aplicación de formularios web?
Creo que Razor intenta asegurarse de que la URL que está pasando a img src es válida. ¿Está seguro de que los archivos existen en el directorio relativo correcto? Tal vez podría intentar pasar la URL en un formato relativo a la raíz (es decir, "~/Resources/Images/Placeholders/generic-user-image.jpg"
). Si eso no ayuda, puedes intentar renderizar la imagen usando @ Html.Image o @ Html.Raw. Y si eso no ayuda, intente @ Url.Content (avatarUrl), pero eso es realmente difícil :)
El analizador Razor no analizará su HTML correctamente porque busca secciones a la vez. En este caso asume que todo el bloque () es HTML.
Intente rodear su HTML con <texto> HTML aquí </ texto> Hace que el analizador sea mucho más fácil de leer e interpretar
Esto suena una campana en alguna parte. Pruebe lo siguiente con los paréntesis alrededor de las variables, parece ayudar un poco al motor de Razor:
@helper MemberListItem(string firstname, string lastname, string avatarUrl)
{
<li>
@(firstname) @(lastname)
<img src="@(avatarUrl)" />
</li>
}
Parece que no eres el único con el problema. Su versión de MVC (MVC2, supongo) tiene un error que provoca una excepción cuando llama a WriteAttributeTo
. Este problema se menciona en la siguiente pregunta de la pila de apilamiento " excepción de referencia nula en el método WriteAttributeTo "
La única solución razonable es utilizar una versión más nueva. Probablemente MVC3 (con update1). Su versión .NET es 4.0+ por lo que no será un problema.