Pregunta

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

Yo estaba a punto de tratar de encontrar una manera de utilizar new SelectList(new {key = "value"}... pero uno, que no trabajo, y dos, estaría infringiendo una ley aquí, si mi lista estática ser declarado en ViewData de todos modos y pasa como IList/IENumerable?

¿Fue útil?

Solución 3

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

Para su información, 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 el lado Ver ASPX:

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

Si alguien tiene una forma más óptima de hacer esto voy a ser feliz a aceptar su respuesta.

Otros consejos

Es una buena práctica de no crear el SelectList en la vista. Debe crearla en el controlador y transmitirla mediante el 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) %>

Todos MVC noobs inicialmente a evitar la 'M' de la palabra, pero sí un poco de empezar por el principio de la acrónimo MVC.Así que tal vez, sólo tal vez, es posible que desee comenzar su solución con un Modelo de...acaba de decir.

No te repitas (SECO).Usted va a copiar y pegar el "nuevo PageData()" para cada Controlador que pasa a la lista de opciones a la Vista.Entonces usted va a querer suprimir o añadir una opción y tiene que editar cada controlador de PageData.

Por otra parte, desea escribir la menor cantidad de código con la menor cantidad innecesariamente verbose "agregar"s "nueva"s "ES"s" y "Nombre"s.Debido a que sólo tiene un par clave-valor en la opción select (y/o un botón de opción de la lista), utilice el más ligero de la estructura de datos posible, es decir,un Diccionario (en el Modelo.

Luego, simplemente haga referencia a la Modelo en el Controlador y convertir el Diccionario a un SelectList en la Vista uso de un DropDownListFor que contiene una LINQ expresión Lambda.

Intimidado?Usted no está solo.Yo era, sin duda.He aquí un ejemplo que he utilizado para enseñar a mí mismo que la M, V, y el C:

El Modelo parte de la 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 bastante sencillo, basta con pasar el modelo.Se evita la creación de un concepto aislado, que probablemente no es aislado a sólo una página.:

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

A la Vista de los usos DropDownListFor (en lugar de DropDownList) y una expresión Lambda para el tipado fuerte en el caso de la refactorización es necesario:

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

Voilà, el 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 por el VALOR de la <option value="6">, que es la Clave del diccionario, desde el "Valor" en el SelectList(), que es el texto/título (por ejemplo,Huevos Benedict) que termina entre la opción etiquetas.

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, si alguna vez los cambios.Sin embargo, el cambio es inevitable y de seis meses a partir de ahora una cena en mi cliente en el restaurante se muere;no por el verde de jamón, pero debido a que eran alérgicos a los huevos y el cocinero se mezclan algunos con sus waffles.

El restaurante necesidades de sus clientes información actualizada para incluir las alergias a los alimentos inmediatamente.Mientras que el amor clientes de la repetición, que no está fresco con muertos clientes que vienen de nuevo como zombies que no tienen manera de pagar porque sus tarjetas de crédito fueron cancelados.

Pregunta Retórica:Debo modificar todos los controladores y puntos de vista relacionados con el cliente huevo preferencias?O simplemente insertar { 7, "Alergia a los Huevos"} en el modelo?

Otra Pregunta Retórica:No son tortillas de huevos?¿Desea agregar {8, "Tortilla de patata, Western"}, {9, "Tortilla de Champiñón-queso Feta-Espinacas"} una vez a la modelo y a las nuevas incorporaciones automágicamente propaga a lo largo de todas las listas desplegables en todos los puntos de vista que hacen uso de ellos?

Línea de base(s) Esta es probablemente la forma más que usted pide, ...pero no dicen MVC, no sólo VC:
1.El uso de un Modelo en el *M*VC.2.El uso de un diccionario en el Modelo cuando una lista de selección se basa en nada más que una "clave principal" y un título.3.Si su lista estática no jive con una base de datos de la tabla de Búsqueda en algún lugar, su aplicación probablemente no es muy útil.Cuando se agrega una opción de una lista estática, es más que probable que usted también tendrá que realizar un insert para la tabla de Búsqueda para evitar una clave principal y clave externa relación de error de integridad con otras tablas en la base de datos.4.El uso de lambda y establecimiento inflexible de tipos de estructuras de datos para evitar errores y obtener typeahead de apoyo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top