Question

Je voudrais attribuer une liste statique des éléments dans un à un SelectList() dans ASP.NET MVC Html.DropDownList(), quelle est la meilleure pratique?

J'étais sur le point d'essayer de trouver un moyen d'utiliser mais new SelectList(new {key = "value"}..., cela ne fonctionne pas, et deux, serais-je enfreint une loi ici, devrait ma liste statique être déclarée dans toute façon et passé ViewData comme IList/IENumerable?

Était-ce utile?

La solution 3

OK, j'ai décidé de prendre mes propres conseils, et cela devrait être défini dans le contrôleur:

Pour votre information, je reviens tout juste:

PageData data = new PageData()
           {
               Formats = new[]
                             {
                                 new { ID = "string", Name = "Text" },
                                 new { ID = "int", Name = "Numeric" },
                                 new { ID = "decimal", Name = "Decimal" },
                                 new { ID = "datetime", Name = "Date/Time" },
                                 new { ID = "timespan", Name = "Stopwatch" }
                             },
               .............

           };
return View(data);

... (ignorer le contexte) et dans le côté Voir ASPX:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...

Si quelqu'un a une façon plus optimale de le faire, je serai heureux d'accepter leur réponse.

Autres conseils

Il est préférable de ne pas créer le SelectList dans la vue. Vous devez créer dans le contrôleur et le transmettre à l'aide du ViewData.

Exemple:

  var list = new SelectList(new []
                                          {
                                              new {ID="1",Name="name1"},
                                              new{ID="2",Name="name2"},
                                              new{ID="3",Name="name3"},
                                          },
                            "ID","Name",1);
            ViewData["list"]=list;
            return View();

vous passez au constructeur: l'objet IEnumerable, le champ de valeur du champ de texte et la valeur sélectionnée

.

dans la vue:

 <%=Html.DropDownList("list",ViewData["list"] as SelectList) %>

Tous MVC noobs éviter d'abord le mot « M », mais il ne démarre un peu au début de l'acronyme MVC. Alors peut-être, juste peut-être, vous pouvez commencer votre solution avec un modèle ... juste dire.

Ne pas répéter vous-même (SEC). Vous allez finir par copier et coller la « nouvelle PageData () » à chaque contrôleur qui passe la liste d'options à une vue. Ensuite, vous allez vouloir supprimer ou ajouter une option et doivent modifier PageData de chaque contrôleur.

De plus, vous voulez saisir la moindre quantité de code avec le plus petit nombre inutilement verbeux « ajouter » s, « nouveau » s « » s et « Nom » s. Parce que vous avez seulement une paire clé-valeur dans l'option de sélection (et / ou une liste de bouton radio), utilisez la structure la plus légère possible de données, à savoir un dictionnaire --En votre modèle.

Alors simplement référence du modèle dans le contrôleur et convertir le dictionnaire à un SelectList dans la vue au moyen d'un DropDownListFor contenant une expression Lambda LINQ.

Intimidé? Tu n'es pas seul. Certainement. Voici un exemple je me enseigner M, V et C:

La partie du modèle de MVC:

using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Web.Routing;
using System.Web.Helpers;
using System.Web.Mvc.Html;
using MvcHtmlHelpers;
using System.Linq;

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences.
   // This is pedagogical example of generating a select option display for a customer's egg preference.  

namespace EzPL8.Models     
{
    public class MyEggs    
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()  //constructor
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},  //show the complete egg menu to customers
                { 1, "I hate eggs"},    //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu

                //confirm with the customer if they want their eggs cooked their usual preferred way, i.e.
                { 2, "Over Easy"},  
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };
    }
}

Le contrôleur est maintenant assez simple, il suffit passer le modèle. Il évite la création d'un concept isolé, qui est probablement pas isolé à une seule page:.

public ActionResult Index()
{
   var model = new EzPL8.Models.MyEggs();
   return View(model);
}

Le point de vue utilise DropDownListFor (au lieu de DropDownList) et une expression lambda pour le typage fort dans le refactoring d'événement est nécessaire:

@Html.DropDownListFor(m => m.Egg, new SelectList( Model.Egg, "Key", "Value"))

Voilà, le résultat HTML:

<select id="Egg" name="Egg">
<option value="0">No Preference</option>
<option value="1">I hate eggs</option>
<option value="2">Over Easy</option>
<option value="3">Sunny Side Up</option>
<option value="4">Scrambled</option>
<option value="5">Hard Boiled</option>
<option value="6">Eggs Benedict</option>
</select>

Note: ne pas confondre par la valeur <option value="6">, qui est la clé du dictionnaire, de la « valeur » dans le SelectList (), qui est le texte / titre (par exemple, les œufs Benedict) qui se termine entre les balises d'option.

Cas d'utilisation : Pour réduire le trafic entre l'application et la base de données que j'ai créé une liste statique pour éviter une requête de base de données pour la liste déroulante que rarement, voire jamais change. Cependant, le changement est inévitable et six mois à partir de maintenant un dîner au restaurant des dies de mon client; non pas à cause du jambon vert, mais parce qu'ils étaient allergiques aux œufs et le cuisinier mélangé certains avec leurs gaufres.

Le restaurant a besoin de leur information à la clientèle mis à jour pour inclure les allergies alimentaires immédiatement. Alors qu'ils aiment des clients réguliers, ils ne sont pas refroidissent avec les clients morts reviennent comme des zombies qui ont aucun moyen de payer parce que leurs cartes de crédit ont été annulées.

Rhétorique Question: Dois-je modifier tous les contrôleurs et points de vue liés aux préférences d'œufs à la clientèle? Ou il suffit d'insérer {7, « allergique aux œufs »} dans le modèle?

Une autre question de pure forme: sont-ils pas des œufs de omelettes? Voulez-vous ajouter {8, « Omelette, occidental »}, {9, « Omelette, champignon-feta-épinards »} une fois le modèle et que les nouvelles additions se propagent automagiquement dans toutes les listes déroulantes dans toutes les vues qui les utilisent ?

Bottom line (s) Ceci est probablement beaucoup plus que vous avez demandé, mais ... vous avez dit MVC, non seulement VC:
 1. Utilisez un modèle * M * VC.  2. Utilisez un dictionnaire dans le modèle lorsqu'une liste de sélection est basée sur rien de plus qu'une « clé primaire » et un titre.  3. Si votre liste statique ne jive pas avec une table de consultation de base de données quelque part, votre application est probablement pas très utile. Lorsque vous ajoutez une option à une liste statique, plus que probable que vous aurez également besoin d'effectuer une insertion à la table de consultation pour éviter une erreur d'intégrité de clé primaire / clé étrangère relation avec d'autres tables de la base de données.  4. Utilisez lambda et fortement les structures de données typées pour éviter les erreurs et obtenir de l'aide typeahead.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top