2010-02-02 3 views
1

Donc .. J'ai un problème. Je suis sûr que presque tout le monde qui a essayé MVC l'a eu. Néanmoins, je n'ai pas réussi à googler une solution ou à en penser une pour moi-même.Rebobinage d'une liste de zones de texte dans ASP MVC2 VS2010 Beta2 après la publication

Le problème est le suivant: J'ai une liste de zones de texte que je voudrais éditer en une seule fois, et j'aimerais aussi ajouter de nouveaux éléments à ma liste. Toutefois, la liaison de texte échoue après la première publication.

J'ai donc fait un petit exemple pour illustrer le problème:

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

    <fieldset> 
     <legend>Fields</legend> 
     <% foreach(string s in Model) { %> 
     <p> 
      <%= Html.TextBox("list",s) %> 
     </p> 
     <% } %> 
     <p> 
      <%= Html.TextBox("newstr") %> 
     </p> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

    <% } %> 

Le code du contrôleur:

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit() 
    { 
     return View(new List<string>() { "aa", "bb", "cc" }); 
    } 

    // Remove empty strings and add the new one 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(List<string> list, string newstr) 
    { 
     List<string> res = list.Where(s => !string.IsNullOrWhiteSpace(s)).ToList(); 

     if (!string.IsNullOrWhiteSpace(newstr)) 
      res.Add(newstr); 

     return View(res); 
    } 

Ainsi, le premier GET je retourne les 3 cordes aa, bb et cc , et obtenir 3 avec leur texte textboxes dans, ainsi que pour en textbox vide de nouvelles chaînes, comme ceci:

aa 
bb 
cc 
Empty. 

maintenant, si j'efface la chaîne bb et ajoute "dd" dans la zone de texte vide, j'obtiens une liste de retour de "aa", "", "cc" et "dd" dans newstr. Cela retourne une nouvelle liste de "aa", "cc", "dd" qui est ce que je m'attendrais à voir dans mes cases à cocher. Au lieu de cela, je reçois:

aa 
aa 
aa 
dd (expected empty) 

donc .. Il y a quelque chose de fondamental, je n'ai pas :) Pourquoi faut-il ignorer mon nouveau modèle de données et utiliser certains des vieux et pas tous?

Je suppose que c'est une sorte de viewstate restante de asp.net, alors comment l'éteindre? Je veux vraiment que la page Web sans état soit annoncée.

Répondre

0

Si vous regardez votre source html, vous verrez que cela n'a rien à voir avec viewstate. Lors du remplissage des entrées après un post, le framework va d'abord rechercher les valeurs affichées et remplir vos entrées en fonction de cela. C'est pourquoi vous obtiendrez "dd" dans votre dernière entrée. La raison pour laquelle vous obtenez "aa" dans le reste des entrées est qu'elles ont toutes le même nom. Votre message ressemblera à quelque chose comme ceci:

list = « aa », list = « », list = « cc »

Ainsi, lorsque vous restituez une entrée avec le nom « liste » le cadre recherchera ce poste et prenez la première valeur qui correspond. Ce sera "aa" à chaque fois. C'est pourquoi vous obtenez "aa" dans toutes vos entrées. Vous ne devriez pas avoir plusieurs <input type="text" /> avec le même nom. Avec des noms uniques, vous réglerez le problème avec les entrées en boucle.

Je ne sais pas s'il existe un moyen de faire un <%=Html.TextBox()%> ne pas regarder dans les données publiées. Mais vous pouvez toujours le changer à un <input type="text" name="newstr" /> régulier et cela fonctionnera.

0

Problème intéressant. Il semble y avoir un problème dans Html.TextBox(). J'ai débogué votre code, et comme vous pouvez le voir, le modèle dans la vue contient la liste correcte. (BTW, j'ai testé cela dans Visual Studio 2008).

Lorsque vous convertissez le

<%=Html.TextBox("list", s) %> 

à une norme

<input id="list" name="list" value="<%=s %>" /> 

cela fonctionne comme cela devrait fonctionner. Est-ce une option?

+0

Oui, ça marche.Le fait l'affaire. Voilà pour htmlhelpers, au moins pour l'instant. Et tout est une option tant que cela fonctionne. Merci à vous deux :) –

Questions connexes