12

Ho due modelli di editor: uno per i decimali e uno per i decimali? (Nullable)ASP.NET MVC 2 - Html.EditorPer un tipo nullable?

Ma quando ho un decimale nullable nel mio modello, si cerca di caricare l'editor decimale normale:

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

Il primo funziona bene, e carica il modello di editor di decimali. Il secondo tenta anche di caricare il modello decimale (e fallisce perché non è un campo decimale).

Il messaggio di errore è:

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

I miei modelli sono dichiarati in questo modo:

modello decimale:

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

Nullable Decimale modello:

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

so tha t Posso farlo funzionare passando il nome del modello, ad esempio

Ma preferirei che funzionasse automaticamente utilizzando il tipo proprio come tutti gli altri modelli.

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

I nomi dei modelli sono Decimal.ascx e Decimal? .ascx? – ZippyV

+0

No sono Decimal.ascx e NullableDecimal.ascx –

+2

Nessuno? .. Risulta che posso "ripararlo" copiando il codice NullableDecimal.ascx all'interno di Decimal.ascx. Stranamente, un decimale standard può essere usato nel modello nullable. Non so perché un decimale non annullabile funzionerà in un modello che ha il codice come: if (myDecimal.HasValue) –

risposta

16

Grazie a Bryan per aver aggiunto una taglia da provare per ottenere una soluzione positiva, ma dovrò rispondere e dire che ho trovato che la risposta è sicuramente NO - non puoi avere un modello nullable scoperto automaticamente dal suo tipo. È necessario utilizzare un nome modello.

Questa è la citazione pertinente dal blog di Brad Wilson allo http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html. Egli è una fonte autorevole su MVC, quindi devo credergli quando dice:

Durante la ricerca per il nome del tipo, il semplice nome viene utilizzato (vale a dire, Type.Name) senza namespace. Inoltre, se il tipo è Nullable, cerchiamo T (quindi si otterrà il modello booleano se si sta utilizzando “bool” o “Nullable”)

Egli va anche a dire

Questo significa che se si sta scrivendo modelli per i tipi di valore, si avrà bisogno di conto per se il valore è annullabile o meno.È possibile utilizzare la proprietà IsNullableValueType di ModelMetadata per determinare se il valore è annullabile. Vedremo un esempio di di seguito con il modello booleano incorporato .

Quindi sì, c'è una risposta a questa domanda, ma sfortunatamente la risposta è NO.

di utilizzare un modello annullabile è necessario esplicitamente utilizzare il nome del modello:

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

Oppure si può utilizzare un modello che gestiscono sia il nullable e il tipo non nullable:

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

Non c'è modo di farlo nel modo desiderato. Può esistere un solo modello per decimale e decimale ?. Ma è possibile determinare nel modello se il valore passato è di tipo nullable in questo modo:

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

Per ulteriori dettagli controllare this blog post

1

Il modello dovrebbe essere chiamato "Nullable`1". Dato che questo corrisponderebbe a qualsiasi struttura Nullable, potresti eseguire un cambiamento sul tipo di modello e rendere il modello parziale appropriato in base al tipo all'interno di "Nullable`1.ascx"

+0

Il mio layout di tastiera nel Regno Unito mi ha fallito: P – Trumpi

2

Al fine per creare un modello per un tipo nullable, devi nominare il modello come tipo di valore di base e quindi creare il modello di editor con un modello nullable.

Ad esempio, voglio fare un modello per int ?. Ho creato un modello di editor denominato "int32.cshtml" e sto utilizzando int? come il modello.

Se volete ulteriori dettagli, guarda qui: http://www.campusmvp.net/blog/asp-net-mvc-editorfor-for-nullable-propierties

0

Sì, si può fare questo senza specificare il modello in Html.EditorFor, ma poi è necessario specificare il modello contro la proprietà annullabile utilizzando l'attributo UIhint.

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