2010-07-09 6 views
0

I ont:
1)En utilisant le modèle complexe MVC 2

public class Model 
{ 
    public String Name { get; set; } 
    public SubModel SubModel { get; set; } 
} 

2)

public SubModel 
{ 
    public String Title { get; set; } 
} 

3) Modèle typé ModelViewUserControl
4) sous-modèle typé SubModelViewUserControl
5) J'ai besoin de:
Afficher sur la page 2 TextBoxes: pour Model.Name et Model.SubModel.Title.

je fais:
1) Page:

<% Html.RenderPartial("ModelViewUserControl", Model); %> 

2) En ModelViewUserControl:

<%= Html.TextBoxFor(m => m.Name) %> 
<% Html.RenderPartial("SubModelViewUserControl", Model.SubModel); %> 

3) En SubModelViewUserControl:

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

Résultat est
Dans Contrôler La méthode de er j'ai Model.Name == "Bla" mais Model.SubModel == null. Bien sûr, j'utilise Html.BeginForm().

HTML:

<input id="Name" name="Name" type="text" value="" />
<input id="Title" name="Title" type="text" value="" />

+0

Le fait est dans l'action du contrôleur (après avoir entré des informations dans les zones de texte et submiting) Model.Name == « Nom », mais Model.SubModel == null –

+0

vous pouvez modifier votre message. Quand vous faites, ajoutez une question. –

Répondre

1

Au lieu d'utiliser RenderPartial je vous recommande d'utiliser editor templates qui vous rendra la vie plus facile:

Dans la vue principale:

<% using (Html.BeginForm()) { %> 
    <%= Html.EditorForModel() %> 
    <input type="submit" value="OK" /> 
<% } %> 

modèle de l'éditeur pour le modèle (~/Views/Shared/EditorTemplates/Model.ascx):

<%= Html.TextBoxFor(x => x.Name) %> 
<%= Html.EditorFor(x => x.SubModel) %> 

Modèle d'éditeur pour le sous-modèle (~/Views/Shared/EditorTemplates/SubModel.ascx):

<%= Html.TextBoxFor(m => m.Title) %> 
1

Assurez-vous que vos deux méthodes d'action utilisent le même type de données pour le modèle.

Votre vue peut afficher les champs de zone de texte comme celui-ci:

<%: Html.TextBoxFor(m => m.Name) %> 
<%: Html.TextBoxFor(m => m.SubModel.Title) %> 

Si vous avez besoin d'aide, diffusez vos méthodes d'action et votre point de vue.

+0

La méthode d'action a la signature (Model model) et obtient avec succès la propriété Name du Model, mais elle n'obtient pas Model.SubModel.Title –

+0

À quoi ressemble votre code source HTML pour ces deux champs? At-il le chemin entier dans l'attribut name? Je suppose que vous utilisez Html.TextBoxFor(), allez en tête et publiez un extrait de votre source HTML. – a7drew

+0

tags a des noms (et les mêmes ID): "Nom" et "Titre". Je pense, la variante de droite est "Nom" et "SubModel.Title" ... –

0

Prenez ce qui suit avec beaucoup de sel. Je travaille toujours à travers ce genre de choses.

Ce n'est pas le moyen le plus simple de comprendre cela, mais une méthode de débogage que j'utilise pour ces choses est de changer le paramètre d'action en FormCollection. Ensuite, je fais:

 StringBuilder sb = new StringBuilder(); 
     foreach (string key in fc.Keys) 
     { 
      sb.Append("Key: " + key + " Value: " + fc[key]); 
     } 

Et inspecter la valeur de sb dans le débogage. C'est probablement un mauvais gaspillage de temps, mais c'est comme ça que j'ai trébuché jusqu'ici.

Le problème que vous rencontrez est la liaison du modèle. L'élément d'entrée Title doit être nommé quelque chose comme [ObjectType] _ [PropertyName]. Je ne sais pas pourquoi le Html.TextBoxFor ne gère pas cela.

Questions connexes