Ottieni il testo da Html.DropdownListFor … MVC3

Ho un modello:

public class DocumentModel { public int TypeID { get; set; } public List DocumentTypes { get; set; } } 

Ho una vista:

  @Html.DropDownListFor(x => x.TypeID, Model.DocumentTypes, "- please select -") 

Popolo la mia discesa

  var model = new DocumentModel(); model.DocumentTypes = GetDocumentTypes(); private static List GetDocumentTypes() { var items = new List { new SelectListItem {Text = @"Text #1", Value = "1"}, new SelectListItem {Text = @"Text #2", Value = "2"}, }; return items; } 

Ho un’azione del controller quando il modulo viene posticipato:

  [HttpPost] public void UploadDocument(DocumentModel model) { if (ModelState.IsValid) { // I want to get the text from the dropdown } } 

Come ottengo il testo dal mio menu a discesa? Grazie

Non è ansible ottenerlo facilmente con l’associazione modello predefinita. Devi fare una piccola soluzione come questa.

1) Aggiungi una nuova proprietà al tuo modello / viewmodel per memorizzare il testo selezionato

 public class DocumentModel { public int TypeID { get; set; } public List DocumentTypes { get; set; } public string SelctedType { set;get;} } 

2) Utilizzare il metodo Html.HiddenFor Helper per creare una variabile nascosta nel modulo per questa proprietà

 @Html.HiddenFor(x => x.SelctedType) 

3) Usa un piccolo javascript per sovrascrivere l’invio! ie; Quando l’utente invia il modulo, recupera il testo selezionato dal menu a discesa e imposta tale valore come valore del campo Nascosto.

 $(function () { $("form").submit(function(){ var selTypeText= $("#TypeID option:selected").text(); $("#SelctedType").val(selTypeText); }); }); 

Ora nel tuo metodo di azione HTTPPost , questo sarà disponibile nella proprietà SelectedType .

 [HttpPost] public void UploadDocument(DocumentModel model) { if(ModelState.IsValid) { string thatValue=model.SelectedType; } } 

se quello che vuoi fare è recuperare l’object selezionato, allora questo può fare il lavoro:

  var selecteItem = model.DocumentTypes.Where(item=>item.Selected).FirstOrDefault(); 

Saluti!

Sul tuo modello avrei un’altra stringa –

 public string Selected{ get; set; } 

quindi a tuo avviso:

 @Html.DropDownListFor(model => model.Selected, new SelectList(Model.DocumentTypes, "Value", "Text")) 

Sono inciampato qui cercando di trovare il modo di ottenere il valore del testo da una SelectList per visualizzarlo in un formato diverso da DropDownList (sto riutilizzando il mio Edit ViewModel in quanto ha tutti i dati che ho richiesto)

 var text = selectList.Where(q => q.Selected == true).First().Text;