Como obter DropDownList SelectedValue no controlador no MVC

Eu tenho dropdownlist, que preenchi do database. Agora eu preciso para obter o valor selecionado no Controller fazer alguma manipulação. Mas não entendendo a ideia. Código que eu tentei.

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

Visão

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

   

1ª Abordagem (via Request ou FormCollection):

Você pode lê-lo a partir do Request usando Request.Form , seu nome dropdown é ddlVendor então passe a chave ddlVendor no formCollection para obter seu valor que é postado pelo formulário:

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

ou use FormCollection :

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

2ª Abordagem (Via Modelo):

Se você quiser com o Model binding, então adicione uma propriedade no Model:

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

e na vista:

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

e em ação:

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

ATUALIZAR:

Se você quiser postar o texto do item selecionado também, terá que adicionar um campo oculto e, na checkbox de seleção suspensa, definir o texto do item selecionado no 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 definir o campo oculto:

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

Modelo

Modelo muito básico com o campo Gênero. GetGenderSelectItems() retorna itens selecionados necessários para preencher 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" }; } } 

Visão

Por favor, certifique-se de que você colocou o seu @Html.DropDownListFor em uma tag de formulário.

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

Controlador

Seu nome de exibição .cshtml Razor deve ser o mesmo que o nome da ação do controlador e o nome da pasta deve corresponder ao nome do controlador, como 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); } } 

Indo além

Agora vamos torná-lo fortemente tipado e enum independente:

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

Se você está procurando algo leve, eu adicionaria um parâmetro à sua ação.

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

O que está acontecendo em seu código agora é que você está passando o primeiro argumento de string de “ddlVendor” para Html.DropDownList , e isso está dizendo à estrutura do MVC para criar um elemento com um name de “ddlVendor”. Quando o usuário enviar o formulário do lado do cliente, ele conterá um valor para essa chave.

Quando o MVC tenta analisar esse pedido em MV , ele procura por MobileList e Vendor e não o encontra, então ele não será preenchido. Adicionando esse parâmetro, ou usando FormCollection como outra resposta sugeriu, você está pedindo ao MVC para procurar especificamente por um elemento de formulário com esse nome, então ele deve preencher o valor do parâmetro com o valor postado.

Use SelectList para vincular @HtmlDropdownListFor e especifique o parâmetro selectedValue nele.

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

Exemplo: você pode fazer assim para se tornar veiculo

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

Eu estava tendo o mesmo problema no asp.net razor C #

Eu tinha uma ComboBox cheia de títulos de um EventMessage , e eu queria mostrar o conteúdo desta mensagem com seu valor selecionado para mostrá-lo em um label ou TextField ou qualquer outro Control

Minha ComboBox foi preenchida assim:

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

No meu EventController eu tinha uma function para ir para a página, na qual eu queria mostrar minha ComboBox (que é de um tipo de modelo diferente, então eu tive que usar uma visão parcial)?

A function para ir do índice à página na qual carregar a 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); } 

A function para a vista parcial está aqui:

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

A function para preencher 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; } 

O modelo partialView se parece com isto:

 @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 : Este é o script usado para obter minha saída na exibição

  @{ 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();" })

Obrigado – isso me ajudou a entender melhor e resolver um problema que tive. O JQuery fornecido para obter o texto de selectedItem não funcionou para mim eu mudei para

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

Se você quiser usar @Html.DropDownList , siga.

Controlador:

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

Visão:

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