Pergunta

Eu gostaria de atribuir uma lista estática de itens em uma SelectList() a um Html.DropDownList() em ASP.NET MVC, qual é a melhor prática?

Eu estava prestes a tentar encontrar uma maneira de usar new SelectList(new {key = "value"}... mas um, que não funcionou, e dois, eu estaria quebrando a lei aqui, deve minha lista estática ser declarado em ViewData de qualquer maneira e passado como IList/IENumerable

Foi útil?

Solução 3

OK eu decidi tomar o meu próprio conselho, e isso deve ser definido no controlador:

FYI, eu só retornou:

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

... (ignore contexto) e no lado do Ver ASPX:

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

Se alguém tem uma maneira mais ideal de fazer isso eu vou ser feliz em aceitar sua resposta.

Outras dicas

É uma boa prática para não criar o SelectList na vista. Você deve criá-lo no controlador e passá-lo usando o ViewData.

Exemplo:

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

você passar para o construtor: o objeto IEnumerable, o campo de valor do campo de texto e o valor selecionado

.

na Vista:

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

Todos MVC noobs inicialmente evitar a palavra 'M', mas não começar um bocado no início do acrónimo MVC. Então, talvez, apenas talvez, você pode querer começar a sua solução com um Modelo ... apenas dizendo.

Do not Repeat Yourself (DRY). Você vai acabar copiando e colando o "novo PageData ()" para cada controlador que passa a lista de opções para a View. Então você vai querer apagar ou adicionar uma opção e tem que editar PageData de cada controlador.

Além disso, você deseja digitar a menor quantidade de código com o menor número desnecessariamente verbose "adicionar" s, "novo" s "é" s, e "Nome" s. Porque você só tem um par de valor-chave na opção de selecção (e / ou uma lista de botão de rádio), use a estrutura de dados mais leve possível, ou seja, um dicionário --em seu modelo.

Em seguida, basta fazer referência ao modelo no controlador e converter o dicionário a um SelectList na Vista usando um DropDownListFor contendo uma expressão LINQ Lambda.

Intimidado? Você não está sozinho. I certamente foi. Aqui está um exemplo que eu usei para me ensinar a M, V, eo C:

A parte 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"}
            };
    }
}

O Controlador é agora bastante simples, basta passar o modelo. Ele evita a criação de um conceito isolado, o que provavelmente não é isolado para apenas uma página:.

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

The View utiliza DropDownListFor (em vez de DropDownList) e uma expressão Lambda para tipagem forte na refatoração evento é necessário:

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

Voilà, o 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: não se confunda com o valor na <option value="6">, que é a chave do dicionário, a partir do "valor" no SelectList (), que é o texto / título (por exemplo ovos Benedict) que acaba entre as tags de opção.

Caso de Uso : Para minimizar o tráfego entre o aplicativo eo banco de dados que eu criei uma lista estática para evitar uma consulta de banco de dados para a lista suspensa que raramente, ou nunca muda. No entanto, a mudança é inevitável e seis meses a partir de agora um jantar no restaurante morre do meu cliente; não por causa do presunto verde, mas porque eram alérgicas a ovos eo cozinheiro misturado alguns em com seus waffles.

O restaurante precisa de suas informações de cliente atualizado para incluir alergias alimentares imediatamente. Enquanto eles adoram repetir os clientes, eles não são legais com os clientes mortas voltando como zumbis que não têm nenhuma maneira de pagar, porque os seus cartões de crédito foram cancelados.

retórico Pergunta: Devo modificar todos os controladores e opiniões relacionadas com as preferências de ovos cliente? Ou simplesmente inserir {7, "alergia a ovos"} no modelo?

Outra pergunta retórica: Não são omeletes ovos? Você quer adicionar {8, "Omelette, Western"}, {9, "omelete, cogumelo-Feta-espinafre"} uma vez para o modelo e têm as novas adições automagicamente propagam em todas as listas suspensas em todos os pontos de vista que os utilizam ?

Bottom line (s) Esta é, provavelmente, muito mais do que você pediu, ... mas você disse MVC, não apenas VC:
1. Use um modelo in * M * VC. 2. Use um dicionário no modelo quando uma lista de seleção é baseado em nada mais do que uma "chave primária" e um título. 3. Se a sua lista estática não jive com um banco de dados de pesquisa em algum lugar da tabela, seu aplicativo provavelmente não é muito útil. Quando você adiciona uma opção para uma lista estática, mais do que provável que você também vai precisar para realizar uma inserção para a tabela de referência para evitar um erro de chave primária / chave estrangeira integridade relacionamento com outras tabelas no banco de dados. 4. Use lambda e estruturas de dados rigidez para evitar erros e obter apoio typeahead.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top