2009-06-05 11 views
3

Je suis confronté à un problème vraiment étrange qui m'a fumé.ASP.Net MVC DefaultModelBinder ne lie pas les propriétés sur POST

J'ai un scénario assez simple où j'ai une vue fortement typée qui est correctement remplie à partir du contrôleur sur le GET, mais ensuite quand il envoie le formulaire au contrôleur, le Reqeust est plein de toutes les bonnes valeurs et à droite noms de clé pour le classeur de modèle par défaut pour remplir correctement l'un de mes objets de modèle, et le DMB crée l'opcode correct, mais il ne remplit aucune des propriétés, ils sont tous dans leur état par défaut. Cela fonctionnait avant, les seuls changements que je peux penser étaient que j'ai essayé un modelbinder personnalisé (puis l'ai enlevé, vérifié deux fois pour m'assurer que je n'utilise pas encore cela), et j'ai refaçonné le modèle pour avoir un classe de base avec certains des accessoires.

Des pensées?

+2

Publier du code. – tvanfosson

+0

Si cela fonctionnait avant, vous pouvez essayer de revenir à ce point et ensuite commencer à faire vos changements à nouveau un à la fois et de travailler sur ce qui le brise ... – Alconja

+0

Postez le code =) Nous ne sommes pas des lecteurs de mind. – zihotki

Répondre

0

Vous l'avez. Le modèle avait été refactorisé d'une manière qui affectait naturellement la capacité du mdoel à le peupler.

+1

Comment l'avez-vous refactorisé et qu'avez-vous fait pour le faire fonctionner? Je ne peux pas dire si mon problème est similaire au vôtre. – Tilendor

+0

désolé d'être mystérieux.Fondamentalement, j'avais poussé un objet de la personne à la vue dans l'action GET, puis obtenant un objet Person à partir du formulaire dans l'action POST. J'ai changé l'action GET pour remplir le formulaire w/un viewmodel qui avait plus d'informations, et le viewmodel avait une personne comme une de ses propriétés, qui a changé la façon dont les noms ont été générés dans les champs de formulaire. Modifier le POST pour utiliser une structure plus similaire a résolu le problème. – Paul

+0

J'ai un problème similaire - que voulez-vous dire 'changer le poste'? – codeulike

3

Un scénario très similaire - que le DefaultModelBinder est - essentiellement - ne lie pas à votre modèle, arrise si vous donniez votre modèle lié objet le même nom que l'une de ses propriétés:

Modèle

Public Property ArbitraryName1 As Integer 
Public Property Answer As String 
Public Property ArbitraryName2 As Boolean 

Voir

<p/> ... @Model.ArbitraryName1 
<p/> Answer: @Html.TextBoxFor(Function(model) model.Answer) 
<p/> ... @Html.CheckBoxFor(Function(model) model.ArbitraryName2) 

Contrôleur

<HttpPost()> 
Function Index(answer As Model) As ActionResult 
    ' answer is Nothing 
End Function 

(utilisant ASP.NET MVC 3)

0

Le nom de votre entrée param ne doit pas être égal à un nom de propriété de l'objet. Rappelez-vous que toutes les données provenant d'un tableau de nom -> valeur et la liaison par défaut utilisent les noms pour faire fonctionner la relation.

0

J'ai eu ce comportement en déplaçant deux propriétés du haut de la classe vers le bas. Je n'arrive toujours pas à comprendre pourquoi cela a empêché la liaison d'une troisième propriété de fonctionner (donc ce n'est pas une solution autant qu'une «surveillance») mais j'ai répété le changement plusieurs fois et à chaque fois que la reliure est passée travailler pour ne pas travailler. J'ai également constaté qu'après avoir fait ce changement, j'ai parfois dû «nettoyer» la solution pour que la reliure recommence à fonctionner.

Questions connexes