2009-05-15 11 views
14

Desidero assegnare un elenco statico di elementi in un SelectList() a un Html.DropDownList() in ASP.NET MVC, qual è la procedura migliore?Come aggiungere un elenco statico di elementi in MVC Html.DropDownList()

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, dovrebbe essere il mio elenco statico essere dichiarato in ViewData comunque e passato come IList/IENumerable?

risposta

3

OK ho deciso di prendere il mio consiglio, e questo dovrebbero essere definiti 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 nella vista Lato ASPX:

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

+0

Ho selezionato la mia risposta poiché è quella con cui sono andato. – GONeale

+0

Funziona bene, ma se voglio che il dropdown carichi Decimal come valore di avvio, cosa dovrei fare? – Sakthivel

23

È buona norma non creare la SelectList nella vista. Dovresti crearlo nel controller e passarlo usando 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.

in Vista:

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

d'accordo con Marwan. Creare un oggetto SelectList e passarlo alla vista. Personalmente, avrei delle viste fortemente tipizzate, ma questo è fuori dallo scopo di questa domanda. –

+0

Uso una vista fortemente tipizzata, perché dovresti definire la SelectList nella vista? È una cosa "vista-particolare"? Penso che sarebbe meglio esporre semplicemente i dati, questo è ciò che si intende dare una visione, i dati non il contesto e i dati. – GONeale

+0

In realtà penso che sia molto sbagliato, SelectList viene utilizzato per il rendering di un elenco a discesa che è totalmente specifico dell'interfaccia utente. Cosa succede se ora volessi utilizzare questi dati per un elenco di caselle di controllo o qualcosa che non supporta SelectList? – GONeale

11

Tutti i niubbi MVC inizialmente evitare la parola 'M', ma lo fa un po partono all'inizio della sigla MVC. Quindi forse, solo forse, potresti voler iniziare la tua soluzione con un Modello ... solo dicendo.

Non ripetersi (SECCO). Finirai per copiare e incollare il "nuovo PageData()" su ogni controller che passa l'elenco delle opzioni su una vista. Quindi vuoi eliminare o aggiungere un'opzione e devi modificare i PageData di ogni controller.

Inoltre, si desidera digitare la quantità minima di codice con il minor numero di "add" s, "nuovi", "IS" e "nome" inutilmente prolissi. Poiché nella selezione è presente una coppia chiave-valore (e/o un elenco di pulsanti di opzione), utilizzare la struttura dati più leggera possibile, ovvero un dizionario, nel modello.

Quindi, fare semplicemente riferimento al modello nel controller e convertire il dizionario in una lista di selezione nella vista utilizzando un DropDownListFor contenente un'espressione lambda LINQ.

Intimidato? Non sei solo. Io certamente lo ero. Ecco un esempio che ho usato per insegnare a me stesso M, V, e la C: parte

Il 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 di creare un concetto isolato, che probabilmente non è isolato da 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 confondersi con VALUE in <option value="6">, che è la chiave del dizionario, dal "Valore" in SelectList(), che è il testo/titolo (ad es. Eggs Benedict) t cappello finisce tra i tag di opzione.

caso d'uso: 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 da sei mesi muore una cena al ristorante del mio cliente; non a causa del prosciutto verde, ma perché erano allergici alle uova e il cuoco mescolava un po 'con le loro cialde.

Il ristorante ha bisogno di informazioni sui clienti aggiornate per includere immediatamente le allergie alimentari. Mentre amano i clienti abituali, non sono carini con i clienti morti che tornano come zombi che non hanno modo di pagare perché le loro carte di credito sono state cancellate.

Domanda retorica: Devo modificare tutti i controller e le viste relative alle preferenze del cliente? O semplicemente inserire {7, "Allergic to Eggs"} nel modello?

Un'altra domanda retorica: le uova non sono omelette? Vuoi aggiungere {8, "Omelette, Western"}, {9, "Omelette, funghi-Feta-Spinaci"} una volta al modello e far propagare automaticamente le nuove aggiunte in tutti gli elenchi a discesa in tutte le viste 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 quando un elenco di selezione è basato su nient'altro che una "chiave primaria" e un titolo. 3. Se l'elenco statico non contiene una tabella di ricerca del database da qualche parte, l'app probabilmente non è molto utile. Quando si aggiunge un'opzione a un elenco statico, è più probabile che sia necessario eseguire un inserimento nella tabella Ricerca per evitare un errore di integrità della relazione chiave primaria/chiave esterna con altre tabelle nel database. 4. Utilizzare lambda e strutture di dati fortemente tipizzate per evitare errori e ottenere supporto di typeahead.

+0

Cosa sono tutti i riferimenti 'EzPL8'? Mi sono perso ... o mi manca lo scherzo? –

+1

-1 per la storia di EzPL8. +1 per estrarre i dati dal modello. –

Problemi correlati