Domanda

Ho due modelli di editor: uno per decimale, e uno per decimale?(nullabile)

Ma quando ho un decimale nullabile nel mio modello, cerca di caricare il normale editor decimale:

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

Il primo funziona bene e carica il modello dell'editor decimali.Il secondo cerca 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>" %>
.

Modello decimale NULLAble:

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

So che posso farlo funzionare passando nel nome del modello, ad esempio

Ma preferirei davvero lavorare automaticamente usando il tipo proprio come tutti gli altri modelli.

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

È stato utile?

Soluzione

Grazie a Bryan per aver aggiunto una taglie per cercare di ottenere una soluzione positiva, ma dovrò rispondere e dire che ho scoperto che la risposta è sicuramente no - non puoi avere un modello nullabile scoperto automaticamente il suo tipo. È necessario utilizzare un nome modello.

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

.

Durante la ricerca del nome del tipo, il Il nome semplice è usato (I.e., Type.name) Senza spazio dei nomi. Inoltre, se il tipo è nullabile, cerchiamo T (così Otterrai il modello booleano Sia che tu stia usando "bool" o "Nullable")

continua anche a dire

.

significa se stai scrivendo modelli Per i tipi di valore, dovrai Account per se il valore è nullabile o no. Puoi usare il IsNullableValueType Property of. Modelmetadata per determinare se il il valore è nullabile. Vedremo un Esempio di questo qui sotto con il Modello booleano integrato.

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

Per utilizzare un modello NULLABILE è necessario utilizzare EvisLazionalmente il nome del modello:

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

oppure è possibile utilizzare un modello che maneggia sia il tipo NULLABILE che il tipo non nullabile:

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

Altri suggerimenti

Per creare un modello per un tipo NULLABILE, si chiama il modello come tipo di valore di base e quindi creare il modello di editor con un modello nullabile.

Ad esempio, voglio fare un modello per int?.Ho creato un modello editor denominato "INT32.CSHTML" e sto usando INT?come modello.

Il modello dovrebbe essere chiamato "Nullable`1".Poiché ciò corrisponderebbe a qualsiasi struttura nullabile, è possibile eseguire un interruttore sul tipo di modello e rendere il modello parziale appropriato in base al tipo dall'interno del "nullble`1.scx"

Non c'è modo di farlo nel modo desiderato.Ci può essere solo un modello per decimale e decimale?.Ma è possibile determinare nel modello se il valore passato è di tipo NULLABILE come questo:

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

Per maggiori dettagli Controlla Questo post sul blog

Sì, puoi farlo senza specificare il modello in html.editorforfor, ma è necessario specificare il modello contro la proprietà Nulllable utilizzando l'attributo UIMINT.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top