Cómo obtener DropDownList SelectedValue en el controlador en MVC

Resuelto Raghubar asked hace 9 años • 9 respuestas

Tengo una lista desplegable, que completé desde la base de datos. Ahora necesito obtener el valor seleccionado en el Controlador y realizar alguna manipulación. Pero no entiendo la idea. Código que he probado.

Modelo

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
}

Controlador

 public ActionResult ShowAllMobileDetails()
    {
        MobileViewModel MV = new MobileViewModel();
        MV.MobileList = db.Usp_InsertUpdateDelete(null, "", "", null, "", 4, MergeOption.AppendOnly).ToList();
        MV.Vendor = new SelectList(db.Usp_VendorList(), "VendorId", "VendorName");
        return View(MV);
    }

    [HttpPost]
    public ActionResult ShowAllMobileDetails(MobileViewModel MV)
    {           
        string strDDLValue = ""; // Here i need the dropdownlist value

        return View(MV);
    }

Vista

   <table>           
        <tr>
            <td>Mobile Manufacured</td>
            <td>@Html.DropDownList("ddlVendor", Model.Vendor, "Select Manufacurer") </td>
        </tr>         
        <tr>
            <td>

            </td>
            <td>
                <input id="Submit1" type="submit" value="search" />
            </td>
        </tr>
    </table>
Raghubar avatar Jan 12 '15 18:01 Raghubar
Aceptado

1er enfoque (a través de Solicitud o FormCollection):

Puede leerlo Requestusando Request.Form, su nombre desplegable es, ddlVendorpor lo tanto, pase ddlVendorla clave en formCollection para obtener el valor que se publica en el formulario:

string strDDLValue = Request.Form["ddlVendor"].ToString();

o usar FormCollection:

[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV,FormCollection form)
{           
  string strDDLValue = form["ddlVendor"].ToString();

  return View(MV);
}

2do enfoque (a través del modelo):

Si desea vincular el modelo, agregue una propiedad en el modelo:

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
    public string SelectedVendor {get;set;}
}

y en Vista:

@Html.DropDownListFor(m=>m.SelectedVendor , Model.Vendor, "Select Manufacurer")

y en acción:

[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV)
{           
   string SelectedValue = MV.SelectedVendor;
   return View(MV);
}

ACTUALIZAR:

Si también desea publicar el texto del elemento seleccionado, debe agregar un campo oculto y, en la selección desplegable, cambiar el texto del elemento seleccionado en el campo oculto:

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
    public string SelectVendor {get;set;}
    public string SelectedvendorText { get; set; }
}

use jquery para configurar el campo oculto:

<script type="text/javascript">
$(function(){
$("#SelectedVendor").on("change", function {
   $("#SelectedvendorText").val($(this).text());
 });
});
</script>

@Html.DropDownListFor(m=>m.SelectedVendor , Model.Vendor, "Select Manufacurer")
@Html.HiddenFor(m=>m.SelectedvendorText)
Ehsan Sajjad avatar Jan 12 '2015 11:01 Ehsan Sajjad

Modelo

Modelo muy básico con campo Género. GetGenderSelectItems()devuelve los elementos seleccionados necesarios para completar DropDownList.

public enum Gender 
{
    Male, Female
}

public class MyModel
{
    public Gender Gender { get; set; }

    public static IEnumerable<SelectListItem> GetGenderSelectItems()
    {
        yield return new SelectListItem { Text = "Male", Value = "Male" };
        yield return new SelectListItem { Text = "Female", Value = "Female" };
    }
}

Vista

Asegúrese de envolverlo @Html.DropDownListForen una etiqueta de formulario.

@model MyModel

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Post)
{
   @Html.DropDownListFor(m => m.Gender, MyModel.GetGenderSelectItems())
   <input type="submit" value="Send" />
}

Controlador

El nombre de su vista .cshtml Razor debe ser el mismo que el nombre de la acción del controlador y el nombre de la carpeta debe coincidir con el nombre del controlador, por ejemplo Views\MyController\MyAction.cshtml.

public class MyController : Controller 
{
    public ActionResult MyAction()
    {
        // shows your form when you load the page
        return View();
    }

    [HttpPost]
    public ActionResult MyAction(MyModel model)
    {
        // the value is received in the controller.
        var selectedGender = model.Gender;
        return View(model);
    }
}

Ir más lejos

Ahora hagámoslo fuertemente tipado y enumerado independiente:

var genderSelectItems = Enum.GetValues(typeof(Gender))
    .Cast<string>()
    .Select(genderString => new SelectListItem 
    {
        Text = genderString,
        Value = genderString,
    }).AsEnumerable();
Andrei avatar Oct 19 '2015 17:10 Andrei