2010-02-02 6 views
1

J'ai une vue dans MVC 2 où je modifie une «page». Une page a un nom, un titre et un contenu. Le contenu est de type EditableContent, avec Width, CssClass et Columns. Colonnes est une liste.Non-concordance d'ID de liaison de modèle ASP.NET MVC

Quand je fais cela dans la vue:

<%= Html.TextBoxFor(m => m.Name) %> 

Il génère le code HTML suivant:

<input type="text" value="About Page" name="Name" id="Name"> 

Et quand je poste à l'action Edit dans ContentController:

/// <summary> 
/// Edits the specified form. 
/// </summary> 
/// <param name="item">The content page.</param> 
/// <returns>ActionResult for edit</returns> 
[HttpPost] 
public ActionResult Edit(Page item) 
{ 
    if (ModelState.IsValid) 
    { 
    } 

    return View(item); 
} 

Il ne peut pas lier la propriété Name à item.Name. En recherchant les valeurs dans Request.Form, je vois le paramètre Name.

Si je rends la zone de texte manuellement, en utilisant ceci:

<%= Html.TextBox("item.Name", Model.Name)%> 

La valeur est binded parfaitement à l'instance de page dans l'action du contrôleur. Je fais quelque chose de fondamentalement faux ici?

Répondre

0

Si votre paramètre de méthode d'action est nommé point, le DefaultModelBinder cherchera item.name, item.title, item.content.width, etc. Si elle ne peut pas trouver * article. ** à la demande, il ignore le préfixe de l'article et revenir à préfixe vide, à la recherche juste pour nom, titre, content.width, etc.

Les chances sont quelque chose d'autre dans la demande est appelée article (ou * article. **), ce qui provoque cette logique de secours ne se produit pas. Si vous voulez forcer la logique de repli, attribuez le paramètre avec [Bind (Prefix = "")], qui dit "ouais, je sais que ce paramètre a été nommé item, mais prétendre que son nom est réellement". "

0

Juste au-dessus de ma tête, avez-vous essayé d'entrer l'espace de nom complet pour votre paramètre de page dans votre action? Il peut y avoir un conflit de nommage.

+0

J'ai maintenant. Cela n'aide pas. Je me demande si je devrais utiliser le CastleBinder dans MvcContrib. – MartinHN

+0

essayez d'utiliser dans la vue. Merci –

0

Vous devez utiliser des préfixes pour les noms de modèles. Cela isolera l'entrée pour différents modèles. Exemple d'action

public ActionResult Edit([Bind(Prefix="Page")]Page item) 

{...}

lors du rendu d'entrée

<%= Html.TextBox("Page.Name", Model.Name)%> 

Désolé, ne maintenant pas comment faire cette aide en utilisant l'expression lambda.

Questions connexes