2009-05-15 60 views
14

Me gustaría asignar una lista estática de elementos en un SelectList() a un Html.DropDownList() en ASP.NET MVC, ¿cuál es la mejor práctica?Cómo agregar una lista estática de elementos en MVC Html.DropDownList()

estaba a punto de tratar de encontrar una manera de utilizar new SelectList(new {key = "value"}... pero, eso no funcionó, y dos, I estaría infringiendo una ley aquí, se debe declarar mi lista estática en ViewData de todos modos y pasa como IList/IENumerable?

Respuesta

3

bien que decidí seguir mi propio consejo, y esto debe ser definido en el controlador:

FYI, Me acabo de regresar:

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

... (ignorar el contexto) y en la vista Lado ASPX:

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

Si alguien tiene una forma más óptima de hacerlo, estaré encantado de aceptar su respuesta.

+0

He seleccionado mi respuesta, ya que es la que fui con. – GONeale

+0

Esto funciona bien, pero si quiero que el menú desplegable cargue Decimal como valor de inicio, ¿qué debo hacer? – Sakthivel

23

Es una buena práctica no crear SelectList en la vista. Debe crearlo en el controlador y pasarlo usando ViewData.

Ejemplo:

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

se pasa al constructor: el objeto IEnumerable, el campo de valor del campo de texto y el valor seleccionado.

en la vista:

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

de acuerdo con Marwan. Cree un objeto SelectList y páselo a su View. Personalmente, tendría puntos de vista fuertemente tipados, pero eso está fuera del alcance de esta pregunta. –

+0

Uso una vista fuertemente tipada, ¿por qué definiría la lista de selección en la vista? ¿Es algo de "ver en particular"? Creo que sería mejor simplemente exponer los datos, eso es lo que se supone que debes dar, los datos, no el contexto y los datos. – GONeale

+0

En realidad, creo que está muy mal, SelectList se utiliza para representar una lista desplegable que es totalmente específica de la interfaz de usuario. ¿Qué pasa si ahora quisiera utilizar esta información para una lista de casilla de verificación o algo que no es compatible con SelectList? – GONeale

11

Todos los noobs MVC inicialmente evitar la palabra 'M', pero sí un poco comienzan a principios del acrónimo MVC. Así que tal vez, solo tal vez, es posible que desee comenzar su solución con un Modelo ... solo diciendo.

Do not Repeat Yourself (DRY). Vas a terminar copiando y pegando el "nuevo PageData()" a cada Controlador que pasa la lista de opciones a una Vista. Luego, querrá eliminar o agregar una opción y deberá editar los datos de página de cada controlador.

Además, desea escribir la menor cantidad de código con el menor número innecesario de "agregar" s, "nuevo" s, "IS" y "Nombre" s. Como solo tiene un par de clave-valor en la opción de selección (y/o una lista de botones de opción), utilice la estructura de datos más ligera posible, es decir, un diccionario en su modelo.

Luego, simplemente haga referencia al Modelo en el Controlador y convierta el Diccionario a una Lista de Selección en la Vista usando una ListaDown Drop para que contenga una expresión LINQ Lambda.

¿Intimidado? No estas solo. Yo ciertamente lo era. Aquí está un ejemplo Solía ​​enseñar a mí mismo la M, la V, y la C: parte

El Modelo 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"} 
      }; 
    } 
} 

El controlador es ahora bastante simple, simplemente pasando el modelo. Evita crear un concepto aislado, que probablemente no esté aislado en una sola página.:

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

El View utiliza DropDownListFor (en lugar de DropDownList) y se requiere una expresión Lambda de tipado fuerte en la refactorización evento:

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

Voilà, el código HTML resultante:

<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: no se confunda con el VALOR en <option value="6">, que es la clave del diccionario, del "valor" en la lista de selección(), que es el texto/título (por ejemplo, huevos Benedicto) t sombrero termina entre las etiquetas de opción.

caso de uso: Para minimizar el tráfico entre la aplicación y la base de datos que he creado una lista estática para evitar una consulta de base de datos de la lista desplegable que rara vez o nunca cambia hacia abajo. Sin embargo, el cambio es inevitable y dentro de seis meses fallece un restaurante en el restaurante de mi cliente; no por el jamón verde, sino porque eran alérgicos a los huevos y el cocinero mezcló algunos con sus gofres.

El restaurante necesita la información de su cliente actualizada para incluir las alergias a los alimentos de inmediato. Si bien aman a los clientes habituales, no les gusta que los clientes muertos vuelvan como zombis que no tienen forma de pagar porque se cancelaron sus tarjetas de crédito.

Retórica Pregunta: ¿Debo modificar todos los controladores y las vistas relacionadas con las preferencias de huevo de los clientes? O simplemente inserte {7, "Alérgico a los huevos"} en el modelo?

Otra pregunta retórica: ¿No son huevos de tortillas? ¿Desea agregar {8, "Omelette, Western"}, {9, "Omelette, Mushroom-Feta-Spinach"} una vez al modelo y hacer que las nuevas adiciones se propaguen automágicamente a través de todas las listas desplegables en todas las vistas que las usan? ?

El fondo (s) Esta es probablemente mucho más de lo que solicitó, ... pero lo hizo decir MVC, no sólo VC:
1. Uso de un Modelo en * M * VC. 2. Utilice un diccionario en el Modelo cuando una lista de selección se base en nada más que una "clave principal" y un título. 3. Si su lista estática no coincide con una tabla de búsqueda de base de datos en alguna parte, su aplicación probablemente no sea muy útil. Cuando agrega una opción a una lista estática, lo más probable es que también necesite realizar una inserción en la tabla de búsqueda para evitar un error de integridad de clave principal/clave externa con otras tablas en la base de datos. 4. Utilice estructuras de datos lambda y fuertemente tipadas para evitar errores y obtener soporte de escritura anticipada.

+0

¿Qué pasa con todas las referencias 'EzPL8'? Estoy perdido ... ¿o me estoy perdiendo el chiste? –

+1

-1 para la historia de EzPL8. +1 para extraer los datos del Modelo. –

Cuestiones relacionadas