2010-01-06 3 views
2

J'apprends MVC en utilisant la version v2 avec Entity Framework v4. Disons que j'ai 3 objets Game, Points et Players. Ils sont liés de la manière suivante: Le jeu a des points et les points peuvent être associés à un joueur (1 jeu à plusieurs points et un objet point peut avoir un joueur).EditTemplates et objets associés avec MVC2

J'essaie d'utiliser la fonctionnalité EditTemplates dans MVC2 pour afficher mes vues. Dans ma vue Modification du jeu, je souhaite que les informations de base sur l'objet Jeu soient modifiables, ainsi que les objets Points associés. Actuellement, j'utilise "<%= Html.EditorForModel() %>" (ce qui semble assez lent) pour afficher la vue d'édition, puis j'ai un jeu spécifique et des points d'édition de points.

Les données s'affichent correctement et sont modifiables pour les informations de jeu et de point. Quand je vais effectuer la mise à jour et soumettre le formulaire, je reçois l'objet "Jeu" dans ma mise à jour ActionResult. Les propriétés de base sont renseignées pour l'objet Game mais les propriétés profondes telles que les points ne le sont pas; ils apparaissent comme nulles. Si je regarde les variables Request.Form dans le débogage, je peux voir que les champs Points sont passés au serveur mais ne se replacent pas dans l'objet Game.

Dans mon jeu EditTemplate J'utilise ce qui suit pour rendre les Points objets:

<%= Html.EditorFor(c => c.Points) %> 

Mes Points EditTemplate ressemble:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Domain.Model.Entities.Point>" %> 

<%= Html.EditorFor(c => c.PntId)%> 
<tr><td><%= Html.DisplayFor(c => c.User.Username)%></td><td><%= Html.EditorFor(c => c.UserPnt)%></td></tr> 

Mon HTML qui est rendu présente comme suit:

<input id="Points_Points_0__PntId" name="Points.Points[0].PntId" type="hidden" value="226" /> 
<tr><td>Jay</td><td><input class="text-box single-line" id="Points_Points_0__UserPnts" name="Points.Points[0].UserPnts" type="text" value="20" /></td></tr> 

<input id="Points_Points_1__PntId" name="Points.Points[1].PntId" type="hidden" value="227" /> 
<tr><td>Joe</td><td><input class="text-box single-line" id="Points_Points_1__UserPnts" name="Points.Points[1].UserPnts" type="text" value="20" /></td></tr> 

Comment puis-je obtenir les propriétés profondes à poster dans le jeu o bject qui est accepté par Controller Update ActionResult pour que je puisse les mettre à jour en même temps?

MISE À JOUR: Cela semble définitivement être un problème avec la façon dont EditTemplate rend la collection Points. Si j'ajoute manuellement ce qui suit à la vue, il ne semble correctement dans l'objet du jeu:

<input class="text-box single-line" id="Game_Points_0__UserPnts" name="Game.Points[0].UserPnts" type="text" value="20" /> 
     <input class="text-box single-line" id="Game_Points_1__UserPnts" name="Game.Points[1].UserPnts" type="text" value="20" /> 

Toute idée pourquoi cela est rendu en tant que « [Points.Points d'index] au lieu de [Game.Points d'index] J'ai essayé de jouer avec les paramètres du EditFor:

<%= Html.EditorFor(c => c.Points,null,"Game.Points") %> 

mais les entrées rendre comme Game.Points.Game.Points [index]

Répondre

1

Il s'agit apparemment d'un bug dans les premières versions de MVC. Selon le commentaire que j'ai reçu de Microsoft sur le forum MVC, il semble être corrigé dans la version RTM.

Je suis revenu à l'utilisation de la boucle for pour générer le code HTML entre temps.

Voici la réponse du forum MVC pour référence: http://forums.asp.net/t/1515461.aspx

0

Ils doivent être nommés Game.Points [0] .PntId ou vous pouvez ajouter des points en tant qu'argument à votre action et les combiner en action. si vous persistez dans DB, vous devez les attacher.

+0

je me suis demandé si la question est parce qu'il est rendu comme « Points.Points [index] ». Cela n'a pas l'air correct.Je ne vois pas un moyen de contrôler le nom que l'entrée "Points" sont rendus. Cela est fait automatiquement par MVC quand je lui dis d'utiliser "Html.EditorFor (c => c.Points)" J'ai essayé d'ajouter "IList Points" en tant que paramètre à ma mise à jour ActionResult mais cela a également retourné null. – Jay

Questions connexes