J'utilise le framework de démarrage Twitter, donc pour que les méthodes EditorFor et DisplayFor produisent ce dont j'ai besoin, j'ai créé des modèles personnalisés pour chaque type (chaîne, texte, mot de passe, etc.). comme précédemment, j'ai créé le modèle suivant et l'ai inséré dans Boolean.cshtml:
@model bool
<div class="control-group">
<div class="controls">
<label class="checkbox">
@Html.CheckBoxFor(m => m, new {@class = "checkbox"})
@Html.LabelFor(m => m)
</label>
</div>
</div>
Assez simple, mais quand j'utilise:
@Html.EditorFor(m => m.RememberMe)
Je reçois une exception disant que la valeur en basse ne peut pas être nulle:
The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'System.Boolean'.
Qu'est-ce que je rate? On dirait que cela devrait être simple. Le champ sur l'objet modèle se présente comme suit:
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
Merci.
UPDATE: Il semble donc qu'il s'agisse finalement de créer un objet de modèle de vue vide et de le transmettre à la vue au lieu de laisser MVC en créer un lui-même.
Je ne le ferais pas comme ça. Si la valeur peut être null, je m'assurerais que votre modèle d'éditeur a un booléen nullable comme type de modèle. Votre modèle d'éditeur (dans Views\Shared\EditorTemplates\Boolean.cshtml) serait donc:
@model Boolean?
@Html.CheckBox("", Model.HasValue && Model.Value)
Et puis dans le rasoir de votre vue principale, vous pourriez avoir:
<div class="control-group">
<div class="controls">
<label class="checkbox">
@Html.EditorFor(m => m, new {@class = "checkbox"})
@Html.LabelFor(m => m)
</label>
</div>
</div>
En lisant les réponses jusqu'à présent, j'ai commencé à me demander comment était initialisé l'objet du modèle. Donc, c'est plutôt bizarre, mais j'ai trouvé la réponse. Espérons que quelqu'un puisse expliquer l'étrangeté. Peut-être comment MVC initialise un objet de modèle si vous n'en spécifiez pas.
Le modèle Internet MVC par défaut comporte les éléments suivants pour l'action de connexion:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
Cela donne l'erreur. Le changer pour ceci résout cependant le problème:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
var loginModel = new LoginModel();
ViewBag.ReturnUrl = returnUrl;
return View(loginModel);
}
Donc, cela répond à la question sur la façon de résoudre le problème, mais laisse toujours la raison non résolue. Cela pourrait-il être dû au fait que MVC crée une instance de l'objet d'une manière différente, par exemple avec réflexion ou autre?
Vous pouvez changer votre modèle pour qu'il accepte les valeurs nulles comme "oui"/"non"
public bool? RememberMe { get; set; }