Question

J'ai deux modèles de rédaction: une pour décimale et une pour décimale?(nullable)

Mais quand j'ai une décimale nullable dans mon modèle, il essaie de charger l'éditeur décimal normal:

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

Le premier fonctionne bien et charge le modèle d'éditeur décimal.Le second essaie également de charger le modèle décimal (et échoue car ce n'est pas un champ décimal).

Le message d'erreur est:

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

Mes modèles sont déclarés comme ceci:

Modèle décimal:

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

Modèle décimal nullable:

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

Je sais que je peux le faire fonctionner en passant dans le nom du modèle, par exemple

Mais je préférerais vraiment que cela ne fonctionne pas automatiquement en utilisant le type comme tous les autres modèles.

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

Était-ce utile?

La solution

Merci à Bryan d'avoir ajouté une prime à essayer d'obtenir une solution positive, mais je vais devoir répondre et dire que j'ai constaté que la réponse est définitivement non - vous ne pouvez pas avoir de modèle nullable à découvert automatique de son type. Vous devez utiliser un nom de modèle.

Ceci est la citation pertinente du blog de Brad Wilson à http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-Templates-part-3-default-temple.html . Il est une source faisant autorité sur MVC, donc je dois le croire quand il dit:

Lorsque vous recherchez le nom de type, le Le nom simple est utilisé (c'est-à-dire type.name) sans espace de noms. Aussi, si le type est nullable, on cherche t (donc vous obtiendrez le modèle booléen si vous utilisez "bool" ou "Nullable")

Il continue aussi à dire

Cela signifie que si vous écrivez des modèles Pour les types de valeur, vous devrez compte pour savoir si la valeur est nullable ou pas. Vous pouvez utiliser le Propriété islamulablevalueType de Modelmettadata pour déterminer si le la valeur est nullable. Nous verrons un exemple de ceci ci-dessous avec le Modèle booléen intégré.

Alors oui, il y a une réponse à cette question, mais malheureusement, la réponse est non.

Pour utiliser un modèle nullable, vous devez expliquer expliquer le nom du modèle:

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

ou vous pouvez utiliser un modèle qui gère à la fois le nullable et le type non nullable:

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

Autres conseils

Pour créer un modèle pour un type nullable, vous nommez votre modèle en tant que type de valeur de base, puis créez votre modèle d'éditeur avec un modèle nullable.

Par exemple, je veux faire un modèle pour INT?.J'ai créé un modèle d'éditeur nommé "int32.cshtml" et j'utilise int?comme le modèle.

Le modèle devrait être nommé "Nullable`1".Comme cela correspondrait à toute structure nullable, vous pouvez effectuer un commutateur sur le type de modèle et rendre le gabarit partiel approprié en fonction du type de la "nullable "1.ascx"

Il n'y a aucun moyen de le faire dans la façon dont vous voulez.Il ne peut y avoir qu'un seul modèle pour décimal et décimal?Mais vous pouvez déterminer dans le modèle si la valeur transmise est de type nullable comme ceci:

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

Pour plus de détails, vérifiez Ce blog post

Oui, vous pouvez le faire sans spécifier le modèle dans html.editororfor, mais vous avez besoin de spécifier le modèle contre des propriétés nullables à l'aide de l'attribut UIHINT.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top