12

Tengo dos plantillas de editor: una para decimal y otra para decimal? (Anulable)ASP.NET MVC 2 - Html.Editor ¿Para un tipo anulable?

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

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

El primero funciona bien, y carga el editor de plantillas 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>" %> 

anulable decimal plantilla:

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

sé tha t Puedo hacerlo funcionar al pasar el nombre de la plantilla, por ejemplo,

Pero realmente preferiría que simplemente funcionara automáticamente al usar el tipo como todas las otras plantillas.

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

¿Los nombres de sus plantillas son Decimal.ascx y Decimal? .ascx? – ZippyV

+0

No, son Decimal.ascx y NullableDecimal.ascx –

+2

¿Nadie? ... Resulta que puedo "arreglarlo" copiando el código NullableDecimal.ascx dentro de Decimal.ascx. Por extraño que parezca, un decimal estándar se puede utilizar en la plantilla que admite nulos. No sé por qué un decimal no nulo funcionará en una plantilla que tiene código similar: if (myDecimal.HasValue) –

Respuesta

16

Gracias a Bryan por agregar una recompensa para probar para obtener una solución positiva, pero voy a tener que responder y decir que he encontrado que la respuesta es definitivamente NO: no se puede tener una plantilla anulable autodescubierta de su tipo. Debe usar un nombre de plantilla.

Esta es la cita relevante del blog de Brad Wilson al http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html. Él es una fuente autorizada sobre MVC así que tengo que creerle cuando dice:

Al buscar el nombre del tipo, la simple nombre se utiliza (es decir, Type.Name) sin espacio de nombres. Además, si el tipo es anulable, que la búsqueda de T (por lo que obtendrá la plantilla de Boole si está utilizando “bool” o “anulable”)

También continúa diciendo

Esto significa que si estás plantillas para los tipos de valor escritura, que se necesitan para cuenta de si el valor es anulable o no.Puede utilizar la propiedad IsNullableValueType de ModelMetadata para determinar si el valor puede contener nulos. Veremos un ejemplo de de esto a continuación con la plantilla booleana incorporada .

Así que SÍ, hay una respuesta a esta pregunta, pero desafortunadamente la respuesta es NO.

Para utilizar una plantilla anulable debe utilizar explicitamente el nombre de la plantilla:

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

O puede utilizar una plantilla que manejar tanto el anulable y el tipo no anulable:

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

No hay forma de hacerlo de la manera que desee. ¿Puede haber solo una plantilla para Decimal y Decimal ?. Pero se puede determinar en la plantilla si el valor pasado es de tipo anulable así:

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

Para más detalles consultar this blog post

1

La plantilla tendría que ser llamado "Nullable`1". Dado que esto coincidiría con cualquier estructura Nullable, podría hacer un cambio en el tipo de modelo y presentar la plantilla parcial adecuada según el tipo dentro del "Nullable`1.ascx"

+0

Mi diseño de teclado del Reino Unido me ha fallado: P – Trumpi

2

Con el fin para crear una plantilla para un tipo que admite nulos, nombre su plantilla como el tipo de valor base y luego cree su plantilla de editor con un modelo que admite nulos.

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

Si desea obtener más información, mira aquí: http://www.campusmvp.net/blog/asp-net-mvc-editorfor-for-nullable-propierties

0

sí, se puede hacer esto sin especificar la plantilla en Html.EditorFor, pero entonces es necesario especificar la plantilla contra la propiedad anulable con el atributo UIHint.

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