Domanda

Vorrei assegnare un elenco statico di elementi in un SelectList() ad un Html.DropDownList() in ASP.NET MVC, qual è la migliore pratica?

Stavo per cercare di trovare un modo per utilizzare new SelectList(new {key = "value"}... ma uno, che non ha funzionato, e due, sarei infrangendo una legge qui, dovrei mia lista statica essere dichiarati nella ViewData comunque e passato come IList/IENumerable?

È stato utile?

Soluzione 3

OK ho deciso di prendere il mio consiglio, e questo dovrebbe essere definito nel controller:

Cordiali saluti, ho appena tornato:

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);

... (ignorare contesto) e nel lato Vista ASPX:

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

Se qualcuno ha un modo più ottimale di fare questo sarò felice di accettare la loro risposta.

Altri suggerimenti

Si tratta di una pratica migliore per non creare il SelectList nella vista. È necessario creare nel controllore e passarlo con il Viewdata.

Esempio:

  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();

si passa al costruttore: l'oggetto IEnumerable, il campo del valore del campo di testo e il valore selezionato

.

nella vista:

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

Tutti i niubbi MVC inizialmente evitare la parola 'M', ma lo fa un po partono all'inizio della sigla MVC. Quindi, forse, solo forse, si potrebbe desiderare di iniziare la vostra soluzione con una modella ... solo dicendo.

Non Repeat Yourself (DRY). Si sta andando a finire per copiare e incollare il "nuovo PageData ()" per ogni controller che passa l'elenco delle opzioni per una vista. Poi si sta andando a voler eliminare o aggiungere un'opzione e debba modificare PageData di ogni controller.

Inoltre, si desidera digitare la quantità minima di codice con il minor numero di inutilmente prolissi "ADD" s, "nuova" s, "è" s, e "Nome" s. Perché hai solo una coppia chiave-valore nell'opzione di selezione (e / o una lista pulsante di scelta), utilizzare la struttura dei dati più leggera possibile, vale a dire un dizionario --in vostro modello.

Poi basta fare riferimento al modello nel controller e convertire il dizionario per un SelectList nella vista utilizzando un DropDownListFor contenente un'espressione LINQ lambda.

Intimidito? Non sei solo. Io certamente lo era. Ecco un esempio che ho usato per insegnare a me stesso M, V, e il C:

La parte Modello di 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"}
            };
    }
}

Il regolatore è abbastanza semplice, solo di passaggio del modello. Evita la creazione di un concetto isolato, che probabilmente non è isolato ad una sola pagina:.

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

The View utilizza DropDownListFor (invece di DropDownList) è richiesta un'espressione lambda per la tipizzazione forte nel refactoring evento:

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

Voilà, il risultante 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>

Nota: Non lasciatevi confondere dal valore in <option value="6">, che è la chiave dal dizionario, dal "valore" nel SelectList (), che è il testo / titolo (ad esempio uova Benedict) che estremità up tra i tag di opzione.

Use Case : Per ridurre al minimo il traffico tra l'applicazione e il database ho creato un elenco statico per evitare una query di database per l'elenco a discesa che raramente, se mai cambia verso il basso. Tuttavia, il cambiamento è inevitabile e sei mesi da oggi una cena al ristorante stampi del mio cliente; non a causa del prosciutto verde, ma perché erano allergici alle uova e il cuoco mescolato un po 'con loro cialde.

Il ristorante ha bisogno loro informazioni del cliente aggiornato per includere le allergie alimentari immediatamente. Mentre amano ripetere i clienti, non sono raffreddare con i clienti morti a tornare come zombie che non hanno modo di pagare, perché le loro carte di credito sono stati annullati.

domanda retorica: Devo modificare tutti i controller e le viste relative alle preferenze del cliente uovo? O semplicemente inserire {7, "allergici alle uova"} nel modello?

Un altro domanda retorica: non sono forse omelette uova? Vuoi aggiungere {8, "omelette, occidentale"}, {9, "Omelette, Fungo-Feta-Spinaci"} una volta per il modello ed avere le nuove aggiunte automagicamente si propagano in tutte elenchi a discesa in tutti i punti di vista che li utilizzano ?

Linea di fondo (s) Questo è probabilmente il modo più di che avete chiesto, ma ... hai detto MVC, non solo VC:
 1. Utilizzare un modello in * M * VC.  2. Utilizzare un dizionario nel modello in cui un elenco di selezione si basa su nient'altro che una "chiave primaria" e un titolo.  3. Se l'elenco statico non jive con una tabella di database di ricerca da qualche parte, la vostra applicazione probabilmente non è molto utile. Quando si aggiunge la possibilità di un elenco statico, più che probabile che avrete anche bisogno di eseguire un'operazione di inserimento nella tabella di ricerca al fine di evitare un errore di chiave primaria / chiave esterna di integrità rapporto con le altre tabelle del database.  4. Utilizzare lambda e fortemente tipizzati strutture di dati al fine di evitare errori e di ottenere il supporto typeahead.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top