2009-10-29 6 views
3

Avec cette méthode de commande: -Problème avec liant modèle ASP.NET MVC

[AcceptVerbs(HttpVerbs.Post)] 
    public ViewResult Contact(Contact contactMessage) 
    { 
     return View(); 
    } 

Pourquoi ce travail ...

public class Contact 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public string Message { get; set; } 
} 

<% using(Html.BeginForm()) { %> 
<p>Name : <%= Html.TextBox("Name")%></p> 
<p>Email : <%= Html.TextBox("Email")%></p> 
<p>Message : <%= Html.TextBox("Message")%></p> 
<p><input type="submit" value="Send Data" /></p> 

Mais cela ne fonctionne pas?

public class Contact 
{ 
    public string ContactName { get; set; } 
    public string ContactEmail { get; set; } 
    public string ContactMessage { get; set; } 
} 

<p>Name : <%= Html.TextBox("ContactName")%></p> 
<p>Email : <%= Html.TextBox("ContactEmail")%></p> 
<p>Message : <%= Html.TextBox("ContactMessage")%></p> 
<p><input type="submit" value="Send Data" /></p> 

Ne me dites pas que les noms de champs ne sont que partiellement identifiés?

Faites confiance à moi - Tout ce que j'ai fait, c'est d'ajouter le texte "Contact" à chacun des champs de l'objet et à chacun des champs du formulaire. C'est presque comme si MVC se confondait avec les champs commençant tous par les mêmes 7 premiers caractères.

Ce qui donne?

Quelqu'un peut-il faire la lumière là-dessus?

Paul.

+2

Avez-vous une étiquette de forme au second ? – eugeneK

+1

Je confirme, la seconde ne fonctionne pas. Le paramètre est 'null'. Peut-être un bug dans DefaultModelBinder. –

+0

Félicitations pour avoir un titre stupide. S'il vous plaît pouvez-vous penser à le changer? –

Répondre

4

Je ne trouve actuellement aucune explication raisonnable quant à la raison pour laquelle la seconde ne fonctionne pas. Mais cela fonctionne si vous changez votre signature d'action pour ressembler à ceci:

public ViewResult Index([Bind(Prefix="")]Contact contactMessage) 

Je suppose que cela a quelque chose à voir avec le DefaultModelBinder.


MISE À JOUR: Ok, cela commence à être vraiment drôle:

// Not working 
public ViewResult Index(Contact contactMessage) 

// Not working 
public ViewResult Index(Contact contactmessage) 

// Working 
public ViewResult Index(Contact contact) 

// Working 
public ViewResult Index(Contact contactMsg) 

// Working 
public ViewResult Index(Contact abc) 

étrange!


MAJ2:

Ok got it. Vous avez une propriété appelée ContactMessage dans votre modèle et le nom de variable transmis dans l'action est également appelé contactMessage. C'est de là que vient l'ambiguïté. Aucun bug dans DefaultModelBinder. Il ne peut pas se lier à la fois à une propriété de type chaîne et contact, cas fermé :-)

+0

Nice ne l'a pas essayé à la fin, mais le Update2 est tout à fait logique donc +1. – RichardOD

+0

Ok, j'accepte la réponse, mais ce n'est pas si génial! Pourquoi ne puis-je pas avoir un paramètre appelé contactMessage même s'il y a une propriété dans l'objet du même nom? Nous définissons clairement le type que nous voulons transmettre à la méthode, et puisque nous ne pouvons pas surcharger il y a peu de place pour l'ambiguïté, nous devrions obtenir l'objet créé & "propriétés" définies à partir des champs de formulaire correspondants - qu'y a-t-il dans un nom? ... lol ... Pour autant que je sois convaincu c'est un "gotcha" ou "bug" mais aussi longtemps que je sais, je peux contourner ce problème. Merci à tous pour votre aide. –

+0

@ Paul- ce n'est pas un bug. Le classeur DefaultModel essaie également de mapper les identifiants aux paramètres, il ne sait pas quelles sont vos intentions. C'est certainement l'une de ces choses qui vous attrape bien, c'est pourquoi j'ai upvoted votre question! – RichardOD

2

Est-il possible que l'affichage soit recompilé automatiquement lorsque vous avez actualisé votre navigateur, mais que le projet global n'a pas été recréé depuis que vous avez modifié les noms des propriétés?

+0

Ou il n'a pas de balise de formulaire. Impossible de voir un autre problème. –

+0

Essayez le code et vous verrez le problème. –

+0

+1. Oui, le projet n'a pas été reconstruit, c'était ma première pensée. – RichardOD

0
<% using(Html.BeginForm()) { %> 

manque de votre exemple non travail.

Ou .. Peut-être que le nom du paramètre contactMessage est en conflit avec le numéro de variable dans le formulaire.

+0

J'ai enlevé les étiquettes pour la brièveté ... C'est dans ma forme. –

1

code vos zones de texte comme celui-ci:

<%=html.TextBox("Contact.Name")%> 

et vous signature d'action comme celui-ci:

public ViewResult Index([Bind(Prefix="Contact")]Contact contactMessage) 

J'espère que cette aide et bonne chance

+0

Nolo: Je n'ai pas apprécié de pouvoir le faire - cool !!! :-) Je vais essayer de me souvenir de celui-ci. –