2012-06-14 14 views
6

Ho un modello:ottenere il testo da Html.DropdownListFor .... MVC3

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

Ho una visione:

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

Io popolo mia discesa

 var model = new DocumentModel(); 
     model.DocumentTypes = GetDocumentTypes(); 

private static List<SelectListItem> GetDocumentTypes() 
    { 

     var items = new List<SelectListItem> 
         { 
          new SelectListItem 
           {Text = @"Text #1", Value = "1"}, 
          new SelectListItem 
           {Text = @"Text #2", Value = "2"}, 
         }; 

     return items; 

    } 

Ho un'azione 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

+0

Volevi recuperare l'articolo selezionato? –

+0

Credo che su un modulo di invio contenente un elenco a discesa, viene inviato solo il "VALORE" selezionato. Puoi prendere il valore e cercare il testo dall'elenco, oppure puoi espandere e pianificare per esso e passarlo in a' @ Html.HiddenFor() '. – user1166147

risposta

17

È possibile che non si ottenga facilmente questo collegamento con il modello predefinito. Devi fare una piccola soluzione come questa.

1) aggiungere una nuova proprietà al modello/ViewModel per memorizzare il testo selezionato

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

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

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

3) Utilizzare 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; 
    } 
} 
+0

Grazie per la risposta, ma model.SelectedType è null quando viene chiamato UploadDocument.Mi manca ancora qualcosa – BoundForGlory

+0

@ user1202717: Usa un avviso nel passaggio 3 prima di inviare il modulo (subito dopo aver impostato il valore del campo nascosto) per vedere se lo hai impostato correttamente. – Shyju

+1

Funziona. Vedo che hai modificato questa linea 'var selTypeText = $ ("# TypeID option: selected"). Text();' Non posso credere che i dropdown siano un tale dolore in mVC. Grazie – BoundForGlory

2

se ciò che si vuole fare è quello di recuperare l'elemento selezionato allora questo può fare il lavoro:

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

Cheers!

+0

Eseguo questo e selectedItem è null – BoundForGlory

1

del modello avrei un'altra stringa -

public string Selected{ get; set; } 

quindi a suo avviso:

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

Ho provato questo e ho eseguito questa riga di codice 'var selecteItem = model.DocumentTypes.Where (item => item.Selected) .FirstOrDefault();' e selectedItem è ancora nullo – BoundForGlory

+0

Non avresti dovuto avere bisogno del genere var ecc. Nel tuo controller dovresti semplicemente essere in grado di fare string selezionato = model.Selected; Se si ha quindi un punto di interruzione nella riga successiva, la stringa selezionata dovrebbe avere il valore dal menu a discesa. –

1

Mi sono imbattuto qui cercando di trovare il modo per ottenere il valore del testo di una SelectList per visualizzarla in un formato diverso da DropDownList (sto riutilizzando il mio Edit ViewModel in quanto ha tutti i dati richiesti)

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