MVC3 DropDownListFor - um exemplo simples?

112

Estou tendo problemas com DropDownListFormeu aplicativo MVC3. Consegui usar StackOverflow para descobrir como fazer com que eles apareçam no View, mas agora não sei como capturar os valores em suas propriedades correspondentes no View Model quando ele é enviado. Para fazer isso funcionar, tive que criar uma classe interna que tinha um ID e uma propriedade de valor, então tive que usar um IEnumerable<Contrib>para satisfazer os DropDownListForrequisitos de parâmetro. Agora, entretanto, como MVC FW deve mapear o valor que é selecionado neste menu suspenso de volta para a propriedade de string simples em meu modelo de visualização?

public class MyViewModelClass
{
    public class Contrib
    {
        public int ContribId { get; set; }
        public string Value { get; set; }
    }

    public IEnumerable<Contrib> ContribTypeOptions = 
        new List<Contrib>
        {
            new Contrib {ContribId = 0, Value = "Payroll Deduction"},
            new Contrib {ContribId = 1, Value = "Bill Me"}
        };

    [DisplayName("Contribution Type")]
    public string ContribType { get; set; }
}

Na minha Visualização, coloco o menu suspenso na página assim:

<div class="editor-label">
    @Html.LabelFor(m => m.ContribType)
</div>
<div class="editor-field">
    @Html.DropDownListFor(m => m.ContribTypeOptions.First().ContribId, 
             new SelectList(Model.ContribTypeOptions, "ContribId", "Value"))
</div>

Quando eu envio o formulário, ContribTypeé (claro) nulo.

Qual é a maneira correta de fazer isso?

Trey Carroll
fonte

Respostas:

166

Você deve fazer assim:

@Html.DropDownListFor(m => m.ContribType, 
                new SelectList(Model.ContribTypeOptions, 
                               "ContribId", "Value"))

Onde:

m => m.ContribType

é uma propriedade onde estará o valor do resultado.

Sergey Gavruk
fonte
2
OBRIGADO!!! Sergey, é exatamente isso que estou procurando há muitas horas.
Trey Carroll
Obrigado :) pela sua resposta Existe alguma maneira de mostrar "- Selecione--" a partir daqui. ?
kbvishnu de
1
@VeeKeyBee, você pode adicionar um novo item à lista contribTypeOptions, por exemplo, new Contrib {ContribId = -1, Value = "Please Select"}e ele será mostrado na lista suspensa. Do que você pode verificar se ContribTypeé -1este é o meio que o usuário não selecionou nenhum valor
Sergey Gavruk
9
Você pode fazer isso:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "Select, please")
Sergey Gavruk,
1
@SergeyGavruk. Esta resposta foi usada como um truque em algumas perguntas recentes, mas está confundindo alguns usuários por causa da declaração E o último parâmetro do construtor da lista Selecionar é um valor selecionado - O último parâmetro é ignorado pelo método (que cria seu próprio internamente SelectList) . É o valor da propriedade ( ContribType) que determina o que é selecionado (é assim que a vinculação de modelo funciona) e o código deve ser apenas @Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")Você pode editar a resposta para corrigir.
7

Acho que isso vai ajudar: No Controlador, pegue os itens da lista e o valor selecionado

public ActionResult Edit(int id)
{
    ItemsStore item = itemStoreRepository.FindById(id);
    ViewBag.CategoryId = new SelectList(categoryRepository.Query().Get(), 
                                        "Id", "Name",item.CategoryId);

    // ViewBag to pass values to View and SelectList
    //(get list of items,valuefield,textfield,selectedValue)

    return View(item);
}

e em vista

@Html.DropDownList("CategoryId",String.Empty)
Praveen MP
fonte
5
Normalmente não é um padrão deus expor seu repositório ao modo de exibição desta forma.
André Pena
6

Para vincular dados dinâmicos em um DropDownList, você pode fazer o seguinte:

Crie ViewBag no controlador como abaixo

ViewBag.ContribTypeOptions = yourFunctionValue();

agora use este valor na visualização como abaixo:

@Html.DropDownListFor(m => m.ContribType, 
    new SelectList(@ViewBag.ContribTypeOptions, "ContribId", 
                   "Value", Model.ContribTypeOptions.First().ContribId), 
    "Select, please")
Dilip0165
fonte
0
     @Html.DropDownListFor(m => m.SelectedValue,Your List,"ID","Values")

Aqui, o valor é aquele objeto do modelo onde você deseja salvar o seu valor selecionado

Abdul Aleem
fonte