martes, 10 de mayo de 2011
Hace unos días me llegaba, vía formulario de contacto del blog, una consulta cuya respuesta pienso que puede resultar interesante para alguien más, así que ahí va.
El problema con el que se encuentra el amigo F. H. es algo con lo que ya me topé hace tiempo al intentar utilizar el helper
Para los que todavía no lo habéis utilizado, comentar que el helper
Su uso es muy sencillo. Si tenemos una propiedad del modelo, por ejemplo
En tiempo de ejecución, el framework buscará en la carpeta /Views/Shared/EditorTemplates si existe una vista parcial con el nombre del tipo (
El siguiente código podría ser una plantilla de edición válida para el ejemplo anterior, el contenido que podríamos encontrar dentro del archivo
Como se puede observar, simplemente estamos creando un cuadro de texto, con un estilo determinado y una capacidad máxima de 8 caracteres.
Pues bien, y volviendo al tema del post, el problema que comentaba este amigo de Variable not found es que cuando, en lugar de tratarse de un tipo valor puro (como
Básicamente, lo que nos indica el error es que en la plantilla de edición estamos esperando un
Aunque a priori parece que el problema se podría solucionar creando en la carpeta EditorTemplates otra plantilla exclusiva para el tipo anulable
ASP.NET MVC utiliza la misma plantilla de edición para los tipos anulables y sus tipos valor correspondiente. Así, la vista
¡Y eso es todo! Espero que la duda quede resuelta, y que pueda ser de utilidad a alguien más :-)
Publicado en: Variable not found.
El problema con el que se encuentra el amigo F. H. es algo con lo que ya me topé hace tiempo al intentar utilizar el helper
EditorFor()
con propiedades anulables.Para los que todavía no lo habéis utilizado, comentar que el helper
EditorFor()
de ASP.NET MVC es una ayuda imprescindible para crear de forma muy rápida potentes interfaces de introducción de datos. Por ejemplo, hace tiempo vimos cómo podíamos utilizarlo para crear un editor de propiedades de tipo fecha usando jQuery datepicker, y que quedaba la mar de bien ;-)Su uso es muy sencillo. Si tenemos una propiedad del modelo, por ejemplo
Edad
, de tipo int
, podemos desde la vista generar un editor apropiado para ella utilizando la expresión: @Html.EditorFor(model => model.Edad)
En tiempo de ejecución, el framework buscará en la carpeta /Views/Shared/EditorTemplates si existe una vista parcial con el nombre del tipo (
int32
en este caso, que es el nombre real del tipo en la plataforma .NET), y la mostrará para que el usuario pueda editar el valor de esta propiedad.El siguiente código podría ser una plantilla de edición válida para el ejemplo anterior, el contenido que podríamos encontrar dentro del archivo
int32.cshtml
:@model int
@Html.TextBox("",
Model,
new { maxlength=8, style="width: 100px; text-align: right;" }
)
Como se puede observar, simplemente estamos creando un cuadro de texto, con un estilo determinado y una capacidad máxima de 8 caracteres.
Pues bien, y volviendo al tema del post, el problema que comentaba este amigo de Variable not found es que cuando, en lugar de tratarse de un tipo valor puro (como
int32
, DateTime
, double
, etc.) se trata de un tipo anulable (int?
, DateTime?
, double?
…) todo va bien mientras el contenido que queremos editar no sea un nulo, momento en que aparecerá el siguiente error: El modelo pasado al diccionario es NULL, pero este diccionario requiere un elemento de modelo distinto de NULL de tipo ‘System.Int32’.
Básicamente, lo que nos indica el error es que en la plantilla de edición estamos esperando un
int
, como hemos indicado con la directiva @model
de Razor, y estamos recibiendo un valor nulo, lo cual es absolutamente incompatible.Aunque a priori parece que el problema se podría solucionar creando en la carpeta EditorTemplates otra plantilla exclusiva para el tipo anulable
int32?
, rápidamente nos damos cuenta de que esto no sería una tarea sencilla. El nombre interno de los tipos anulables, como de cualquier otro tipo genérico, está bastante lejos de ser manejable e intuitivo… no, la solución es mucho más simple.ASP.NET MVC utiliza la misma plantilla de edición para los tipos anulables y sus tipos valor correspondiente. Así, la vista
int32.cshtml
será utilizada tanto para editar las propiedades de tipo int
como las int?
. Esto hace que la solución al problema sea, simplemente, modificar ésta para que acepte el tipo correcto de datos, y gestionar los nulos de la forma que más nos interese, por ejemplo mostrando un cero como valor por defecto en el cuadro de edición, como en el siguiente código:@model int?
@Html.TextBox("",
Model ?? 0,
new { maxlength=8, style="width: 100px; text-align: right;" }
)
¡Y eso es todo! Espero que la duda quede resuelta, y que pueda ser de utilidad a alguien más :-)
Publicado en: Variable not found.
5 Comentarios:
muchas gracias, jose.
espero que le pueda ser util a alguien mas.
Fernan.
Gracias a ti, Fernando!
Un saludo :-)
Muhas gracias, exc aporte!!!
Gracias, pero como seria cuando es un Datetime?
Igual, sustituye int por DateTime en los ejemplos y listo.
Saludos
Enviar un nuevo comentario