MVC3 Html.HiddenFor(Modèle => le Modèle.Id) de ne pas passer à l'arrière du Contrôleur

J'ai créé un typage fort MVC3 Rasoir vue à l'aide de l'échafaudage code.

Le modèle est un POCO avec un type de base de PersistentEntity qui définit une propriété appelée Créées, mises à Jour et Id.

Id est un entier (int), Créé et mis à Jour sont DateTime.

Je suis en utilisant Html.HiddenFor pour créer le champ caché de la vue.

@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.Created)
@Html.HiddenFor(model => model.Updated)

Sur la page, l'entrée est rendu correctement, avec l'Id dans la valeur.

<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." id="Id" name="Id" type="hidden" value="12">

Toutefois, lorsque la page est envoyée au contrôleur [HttpPost]Edit(Model model) la propriété Id est toujours 0. Créé et mis à Jour sont correctement remplie avec les valeurs de la Vue.

MVC3 Html.HiddenFor(Modèle => le Modèle.Id) de ne pas passer à l'arrière du Contrôleur

Ce doit être de 12 dans le cas de l'exemple dans ce post. Ce qui ne va pas?


Je suis conscient que je peux changer la signature de la méthode de [HttpPost]Edit(int personID, Person model) comme le personID est dans la chaîne, cependant pourquoi le modèle ne se remplissent avec le champ caché?


Mise à jour

Le problème était que le setter sur PersistentEntity était protégé, l'ASP ne pourrait pas définir la propriété, et l'a avalé. La modification de ce public a résolu le problème.

public abstract class PersistentEntity
{
    public virtual int Id { get; protected set; }
    public virtual DateTime Created { get; set; }
    public virtual DateTime Updated { get; set; }
}
Cela devrait fonctionner. Avez-vous vérifié le constructeur et le setter de la propriété de Id dans votre classe?
Il fonctionne pour moi, donc nous sommes en manque de quelque chose qui n'est pas mentionné dans la question - custom liants, javascript personnalisé soumettre le formulaire, quelque chose comme ça...
Comment le modèle de la classe contenant l'Id de la propriété?
Je pense que vous avez raison - le numéro d'identification setter est protégé. ASP MVC a été à avaler le fait qu'il ne pourrait pas définir la Id. Changer pour un non protégés setter résolu le problème.
Merci pour la mise à jour que vous avez ajouté à votre question. Cela m'a donné une idée de où chercher dans mon cas. C'est un peu malheureux que par les regards de la programmation par la convention ne donne pas nécessairement beaucoup de traces d'infos, d'exception, etc. dire que vous voulez vous faire du mal.

OriginalL'auteur Darbio | 2011-09-26