Cómo obtener DropDownList SelectedValue en Controller en MVC

Tengo lista desplegable, que he llenado de la base de datos. Ahora necesito hacer que el valor seleccionado en Controller haga algo de manipulación. Pero no entendiendo la idea. Código que he intentado.

Modelo

public class MobileViewModel { public List 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); } 

Ver

  
Mobile Manufacured @Html.DropDownList("ddlVendor", Model.Vendor, "Select Manufacurer")

Primer enfoque (a través de Request o FormCollection):

Puede leerlo desde Request utilizando Request.Form , su nombre desplegable es ddlVendor así que pase la clave ddlVendor en formCollection para obtener su valor que se publica por formulario:

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

o use FormCollection :

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

Segundo enfoque (a través del modelo):

Si lo desea con el enlace del modelo, agregue una propiedad en el modelo:

 public class MobileViewModel { public List 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 MobileList; public SelectList Vendor { get; set; } public string SelectVendor {get;set;} public string SelectedvendorText { get; set; } } 

use jquery para establecer el campo oculto:

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

Modelo

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

 public enum Gender { Male, Female } public class MyModel { public Gender Gender { get; set; } public static IEnumerable GetGenderSelectItems() { yield return new SelectListItem { Text = "Male", Value = "Male" }; yield return new SelectListItem { Text = "Female", Value = "Female" }; } } 

Ver

Por favor, asegúrese de envolver su @Html.DropDownListFor en una etiqueta de formulario.

 @model MyModel @using (Html.BeginForm("MyController", "MyAction", FormMethod.Post) { @Html.DropDownListFor(m => m.Gender, MyModel.GetGenderSelectItems())  } 

Controlador

Su nombre de vista .zshtml 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 enum independiente:

 var genderSelectItems = Enum.GetValues(typeof(Gender)) .Cast() .Select(genderString => new SelectListItem { Text = genderString, Value = genderString, }).AsEnumerable(); 

Si buscas algo ligero, agregaría un parámetro a tu acción.

 [HttpPost] public ActionResult ShowAllMobileDetails(MobileViewModel MV, string ddlVendor) { string strDDLValue = ddlVendor; // Of course, this becomes silly. return View(MV); } 

Lo que está sucediendo en su código ahora, es que está pasando el primer argumento de cadena de “ddlVendor” a Html.DropDownList , y eso le está diciendo al framework MVC que cree un elemento con un name de “ddlVendor”. Cuando el usuario envía el formulario del lado del cliente, entonces, contendrá un valor para esa clave.

Cuando MVC intente analizar esa solicitud en MV , buscará MobileList y Vendor y no encontrará ninguno, por lo que no se completará. Al agregar este parámetro o usar FormCollection como ha sugerido otra respuesta, le está pidiendo a MVC que busque específicamente un elemento de formulario con ese nombre, por lo que debe completar el valor del parámetro con el valor publicado.

Use SelectList para enlazar @HtmlDropdownListFor y especifique el parámetro selectedValue en él.

http://msdn.microsoft.com/en-us/library/dd492553(v=vs.108).aspx

Ejemplo: puedes hacer esto para conseguir el mismoid

 @Html.DropDownListFor(m => m.VendorId,Model.Vendor) public class MobileViewModel { public List MobileList; public SelectList Vendor { get; set; } public int VenderID{get;set;} } [HttpPost] public ActionResult Action(MobileViewModel model) { var Id = model.VenderID; 

Estaba teniendo el mismo problema en la afeitadora asp.NET C #

Tenía un ComboBox lleno de títulos de un EventMessage , y quería mostrar el contenido de este mensaje con su valor seleccionado para mostrarlo en una etiqueta o TextField o cualquier otro Control

Mi ComboBox se llenó así:

  @Html.DropDownList("EventBerichten", new SelectList(ViewBag.EventBerichten, "EventBerichtenID", "Titel"), new { @class = "form-control", onchange = "$(this.form).submit();" }) 

En mi EventController tenía una función para ir a la página, en la que quería mostrar mi ComboBox (que es de un tipo de modelo diferente, así que tuve que usar una vista parcial).

La función para ir de índice a página en la que cargar la vista parcial:

  public ActionResult EventDetail(int id) { Event eventOrg = db.Event.Include(s => s.Files).SingleOrDefault(s => s.EventID == id); // EventOrg eventOrg = db.EventOrgs.Find(id); if (eventOrg == null) { return HttpNotFound(); } ViewBag.EventBerichten = GetEventBerichtenLijst(id); ViewBag.eventOrg = eventOrg; return View(eventOrg); } 

La función para la vista parcial está aquí:

  public PartialViewResult InhoudByIdPartial(int id) { return PartialView( db.EventBericht.Where(r => r.EventID == id).ToList()); } 

La función para llenar EventBerichten:

  public List GetEventBerichtenLijst(int id) { var eventLijst = db.EventBericht.ToList(); var berLijst = new List(); foreach (var ber in eventLijst) { if (ber.EventID == id ) { berLijst.Add(ber); } } return berLijst; } 

El modelo de vista parcial se ve así:

 @model IEnumerable  @foreach (var item in Model) {  } 
EventID Titel Inhoud BerichtDatum BerichtTijd
@Html.DisplayFor(modelItem => item.EventID) @Html.DisplayFor(modelItem => item.Titel) @Html.DisplayFor(modelItem => item.Inhoud) @Html.DisplayFor(modelItem => item.BerichtDatum) @Html.DisplayFor(modelItem => item.BerichtTijd)

VIEUW : Esta es la secuencia de comandos utilizada para obtener mi salida en la vista

  @{ Html.RenderAction("InhoudByIdPartial", Model.EventID); } 
Berichten over dit Evenement
@Html.DropDownList("EventBerichten", new SelectList(ViewBag.EventBerichten, "EventBerichtenID", "Titel"), new { @class = "form-control", onchange = "$(this.form).submit();" })

Gracias – esto me ayudó a entender mejor y resolver un problema que tenía. El JQuery proporcionado para obtener el texto de selectedItem NO funcionó para mí lo cambié a

 $(function () { $("#SelectedVender").on("change", function () { $("#SelectedvendorText").val($(**"#SelectedVender option:selected"**).text()); }); }); 

Si desea usar @Html.DropDownList , siga.

Controlador:

 var categoryList = context.Categories.Select(c => c.CategoryName).ToList(); ViewBag.CategoryList = categoryList; 

Ver:

 @Html.DropDownList("Category", new SelectList(ViewBag.CategoryList), "Choose Category", new { @class = "form-control" }) $("#Category").on("change", function () { var q = $("#Category").val(); console.log("val = " + q); });