MVC3 DropDownListFor: ¿un ejemplo simple?

112

Tengo problemas con DropDownListFormi aplicación MVC3. Pude usar StackOverflow para descubrir cómo hacer que aparezcan en la Vista, pero ahora no sé cómo capturar los valores en sus propiedades correspondientes en el Modelo de Vista cuando se envía. Para que esto funcione, tuve que crear una clase interna que tuviera una ID y una propiedad de valor, luego tuve que usar una IEnumerable<Contrib>para satisfacer los requisitos del DropDownListForparámetro. Ahora, sin embargo, ¿cómo se supone que MVC FW mapeará el valor seleccionado en este menú desplegable de nuevo en la propiedad de cadena simple en mi modelo de vista?

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

En mi Vista coloco el menú desplegable en la página así:

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

Cuando envío el formulario, el ContribTypees (por supuesto) nulo.

¿Cuál es la forma correcta de hacer esto?

Trey Carroll
fuente

Respuestas:

166

Deberías hacer así:

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

Dónde:

m => m.ContribType

es una propiedad donde será el valor del resultado.

Sergey Gavruk
fuente
2
¡¡¡GRACIAS!!! Sergey, esto es exactamente lo que he estado buscando durante muchas horas.
Trey Carroll
Gracias :) por tu respuesta ¿Hay alguna forma de mostrar "- Seleccionar--" desde aquí? ?
kbvishnu
1
@VeeKeyBee, puede agregar un nuevo elemento a la lista contribTypeOptions, por ejemplo, new Contrib {ContribId = -1, Value = "Please Select"}y se mostrará en la lista desplegable. Que se puede comprobar si ContribTypese -1trata de medios que el usuario no ha seleccionado ningún valor
Sergey Gavruk
9
Puede hacer esto:@Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value", Model.ContribTypeOptions.First().ContribId), "Select, please")
Sergey Gavruk
1
@SergeyGavruk. Esta respuesta se ha utilizado como un engaño en algunas preguntas recientes, pero confunde a algunos usuarios debido a la declaración Y el último parámetro del constructor de lista de selección es un valor seleccionado : el último parámetro es ignorado por el método (que construye internamente el suyo SelectList) . Es el valor de la propiedad ( ContribType) lo que determina qué se selecciona (así es como funciona el enlace del modelo) y el código debería ser @Html.DropDownListFor(m => m.ContribType, new SelectList(Model.ContribTypeOptions, "ContribId", "Value")¿Puede editar la respuesta para corregir?
7

Creo que esto ayudará: en el controlador, obtenga los elementos de la lista y el valor seleccionado

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

y en vista

@Html.DropDownList("CategoryId",String.Empty)
Praveen MP
fuente
5
Por lo general, no es un patrón divino exponer su repositorio a la Vista de esta manera.
André Pena
6

Para vincular datos dinámicos en una DropDownList, puede hacer lo siguiente:

Cree ViewBag en el controlador como se muestra a continuación

ViewBag.ContribTypeOptions = yourFunctionValue();

ahora use este valor en la vista como se muestra a continuación:

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

Aquí Valor es ese objeto de modelo donde desea guardar su Valor seleccionado

Abdul Aleem
fuente