Pregunta

Tengo dos plantillas de edición: ¡uno para decimal, y uno para decimal?(anulable)

Pero cuando tengo un decimal anulable en mi modelo, intenta cargar el editor decimal normal:

<%: Html.EditorFor(model => model.SomeDecimal )%>
<%: Html.EditorFor(model => model.SomeNullableDecimal )%>

El primero funciona bien y carga la plantilla del editor decimal.El segundo también intenta cargar la plantilla decimal (y falla porque no es un campo decimal).

El mensaje de error es:

The model item passed into the dictionary is null, but this dictionary requires 
a non-null model item of type 'System.Decimal'. 

Mis plantillas se declaran así:

Plantilla decimal:

<%@ Control Language="C#" 
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal>" %>

Plantilla decimal anulable:

<%@ Control Language="C#" 
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>

Sé que puedo hacer que funcione pasando el nombre de la plantilla, por ejemplo,

Pero realmente preferiría que solo funcione automáticamente usando el tipo como todas las otras plantillas.

<%: Html.EditorFor(model => model.SomeNullableDecimal, 
"NullableDecimalTemplate" )%>

¿Fue útil?

Solución

Gracias a Bryan por agregar una recompensa para tratar de obtener una solución positiva, pero voy a tener que responder y decir que he encontrado que la respuesta es definitivamente no, no puede tener una plantilla anulable descubierta automáticamente de su tipo. Debe usar un nombre de plantilla.

Esta es la cita relevante del blog de Brad Wilson en http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html . Es una fuente autorizada sobre MVC, por lo que tengo que creerlo cuando dice:

Al buscar el nombre del tipo, el Se utiliza el nombre simple (es decir, type.name) Sin espacio de nombres. Además, si el tipo es anulable, buscamos T (por lo que obtendrás la plantilla booleana Si estás usando "BOOL" o "Nullable")

También continúa diciendo

Esto significa si estás escribiendo plantillas Para los tipos de valor, deberá Cuenta por si el valor es anulable o no. Puedes usar el Propiedad isnullablevaluetype de ModelMetaData para determinar si el El valor es anulable. Veremos un Ejemplo de esto a continuación con el Plantilla booleana incorporada.

Entonces, sí, hay una respuesta a esta pregunta, pero desafortunadamente la respuesta es no.

Para usar una plantilla anulable, debe usar el nombre de la plantilla:

<%: Html.EditorFor(model => model.SomeNullableDecimal, "NullableDecimalTemplate" )%>

O puede usar una plantilla que maneje tanto el tipo anulable como el no anulable:

<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
    <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
    <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>

Otros consejos

Para crear una plantilla para un tipo anulable, nombra su plantilla como el tipo de valor base y luego cree su plantilla de editor con un modelo anulado.

Por ejemplo, quiero hacer una plantilla para int?.Creé una plantilla de editor llamada "int32.cshtml" y estoy usando int?como el modelo.

La plantilla tendría que ser nombrada "Nulable`1".Dado que esto coincidiría con cualquier estructura anulada, podría hacer un interruptor en el tipo de modelo y hacer que la plantilla parcial apropiada se basa en el tipo desde el "Nullable`1.ascx"

No hay manera de hacerlo de la manera que desee.¿Hay solo una plantilla para decimal y decimal?Pero puede determinar en la plantilla si el valor aprobado es de tipo anulable como este:

<% if (ViewData.ModelMetadata.IsNullableValueType) { %>
    <%= Html.DropDownList("", TriStateValues, new { @class = "list-box tri-state" })%>
<% } else { %>
    <%= Html.CheckBox("", Value ?? false, new { @class = "check-box" })%>
<% } %>

Para obtener más detalles, compruebe Este post de blog

Sí, puede hacerlo sin especificar la plantilla en HTML.EDITORFOR, pero luego necesita especificar la plantilla contra la propiedad anulable utilizando el atributo UIHINT.

[UIHint("NullableDecimalTemplate")]
public decimal? SomeNullableDecimal { get; set; }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top