2012-06-14 15 views
6

Mam model:Pobierz tekst z Html.DropdownListFor .... MVC3

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

Mam widoku:

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

I wypełnić mojemu rozwijanej

 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; 

    } 

Mam działanie kontrolera, gdy formularz jest odsyłany:

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

Jak mogę uzyskać tekst z mojej rozwijanej listy? Dzięki

+0

Czy chcesz odzyskać wybrany element? –

+0

Sądzę, że na formularzu złożonym z listą rozwijaną wysyłana jest tylko wybrana wartość "VALUE". Możesz wziąć wartość i wyszukać tekst z listy lub możesz go rozwinąć i zaplanować i przekazać w "@ Html.HiddenFor()". – user1166147

Odpowiedz

17

Możesz nie dostać tego łatwo z domyślnym powiązaniem modelu. Musisz zrobić tak małe obejście.

1) Dodaj nową właściwość do modelu/viewmodel przechowywać zaznaczonego tekstu

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

2) użyć metody Html.HiddenFor Helper stworzyć ukrytą zmienną w postaci tej właściwości

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

3) Użyj trochę javascript aby zastąpić przesłanie! to znaczy; Kiedy użytkownik przesyła formularz, Pobierz wybrany tekst z listy rozwijanej i ustaw tę wartość jako wartość pola Ukryte.

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

Teraz w HTTPPost metody działania, będzie dostępny w nieruchomości SelectedType.

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

Dziękuję za odpowiedź, ale model.SelectedType ma wartość null, gdy jest wywoływana funkcja UploadDocument.Nadal czegoś mi brakuje – BoundForGlory

+0

@ user1202717: Użyj alertu w kroku 3 przed przesłaniem formularza (tuż po ustawieniu wartości ukrytego pola), aby sprawdzić, czy ustawiłeś go poprawnie – Shyju

+1

To działa. Widzę, że zmieniłeś wiersz "var selTypeText = $ (" # TypeID option: selected "). Text(); ' Człowiek nie mogę uwierzyć, dropdowns są takim bólem w mVC. Dzięki – BoundForGlory

2

jeśli to, co chcesz zrobić, to pobrać zaznaczony element, to może to zrobić pracę:

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

Cheers!

+0

Uruchomiłem to i selectedItem jest zerowe – BoundForGlory

1

modelu chciałbym mieć inny ciąg -

public string Selected{ get; set; } 

następnie w widoku:

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

Próbowałem tego i uruchomiłem ten wiersz kodu "var selecteItem = model.DocumentTypes.Where (item => item.Selected) .FirstOrDefault(); ' i selectedItem jest nadal pusty null – BoundForGlory

+0

Nie powinieneś był potrzebować var ​​etc stuff. W twoim kontrolerze powinieneś był po prostu zrobić string selected = model.Selected; Jeśli następnie miałeś punkt przerwania w następnym wierszu, wybrany ciąg powinien mieć wartość z rozwijanego menu. –

1

natknąłem tutaj próbuje znaleźć sposób, aby uzyskać wartość tekstu OUT a SelectList, aby wyświetlić go w formacie innym niż DropDownList (używam mojego Edit ViewModel, ponieważ ma wszystkie wymagane dane)

var text = selectList.Where(q => q.Selected == true).First().Text; 
Powiązane problemy