2009-08-12 5 views
0

Je crée une liste de cases à cocher pour gérer des préférences comme suit ...cases à cocher ASP.net MVC (C#)

 <ul> 
      <%foreach (var item in ViewData["preferences"] as IEnumerable<MvcA.webservice.SearchablePreference>) 
       { 
        var feature = new StringBuilder(); 
        feature.Append("<li>"); 
        feature.Append("<label><input id=\"" + item.ElementId + "\" name=\"fpreferences\" type=\"checkbox\" />" + item.ElementDesc + "</label>"); 
        feature.Append("</li>"); 
        Response.Write(feature); 
       } 
      %> 
     </ul> 

Les données transmises au vidéotex de SearchablePreference [] et la liste affiche bien .

La question est; Comment repeupler les cases sélectionnées si la page devait retourner elle-même (c'est-à-dire avoir échoué à la validation).

Dans les formulaires Web, il est géré automatiquement par viewstate; avec les autres éléments d'entrée, je passe simplement les données envoyées à la page via ViewData.

Merci

Répondre

2

Utilisez Html.Checkbox à la place.

+0

Bon point; Je dois avouer que j'étais fanatique –

+0

Trouvé ceci utile: Gotcha 2 - http://www.mikesdotnetting.com/Article/109/ASP.NET-MVC-Entity-Framework-One-to-Many-and-Many-to -Many-INSERTS –

0

Vous devez lire toutes les valeurs, puis les ajouter à la ViewData de la vue à laquelle vous revenez, les écrire dans les cases à cocher dans l'affichage de la vue (de préférence avec Html.Checkbox). À ma connaissance, Html.Checkbox ne gère pas automatiquement viewstate pour vous.

En supposant que j'ai un objet CRUD standard j'ai très souvent quelque chose comme ça dans la vue Edit. (J'utilise le même point de vue pour éditer et nouveau)

<input (other input attribute here) value="<%=(myObj == null ? "" : myObj.AppropriateProperty)%>" /> 
+1

Corrigez-moi si je me trompe, mais MVC n'utilise pas ViewState, et ViewState ne devrait pas être utilisé dans MVC. Si vous avez besoin de ViewState, utilisez Web Forms. – Martin

+0

La chose d'origine dit que dans Webforms vous n'avez pas besoin de faire cela comme vous avez Viewstate; Je ne prévois pas de réécrire une application entière pour un peu de fonctionnalité inepte. D'où la recherche de l'alternative. Ta –

+1

@Russell. Je pense que vous confondez ViewModel avec ViewState. Les HtmlHelpers regardent d'abord ViewData.ModelState ["controlName"]. Value.RawValue puis ViewData.Eval ["controlName"] lors du repeuplement. Vous pouvez lire tout à ce sujet dans le livre Pro ASP.NET MVC Framework que je recommande fortement. – RichardOD

0

Je suis d'accord avec RichardOD, utilisez Html.Checkbox

mais si vous insistez pour le faire manuellement, Voilà comment faire

Utilisez un objet pour conserver les données (si quelque chose est sélectionné ou non) et donnez-le à la vue, en remplissant les cases à cocher, vérifiez si la valeur appropriée est définie et si html "checked = \" cochée \ "" case à cocher

Les sapins Au moment où vous rendez cela, l'objet n'aura que de fausses données, donc rien ne sera sélectionné.

0

Vous avez beaucoup trop de code dans la vue. Cela devrait être fait dans le contrôleur. La vue doit être:

<ul> 
     <%foreach (var item in ViewData["preferences"] as IEnumerable<MvcA.webservice.SearchablePreference>) 
      { 
       <li> 
        <%=Html.Checkbox(........) %> 
       </li> 
      } 
     %> 
    </ul>