2012-08-24 24 views
8

Więc mam następujący (pseudo kod):mvc C# Html.DropDownList i viewbag

string selectedvalud = "C"; 
List<SelectListItem> list= new List<SelectListItem>(); 
foreach(var item in mymodelinstance.Codes){ 
    list.Add(new SelectListItem { Text = item.Name, Value = item.Id.Tostring(), Selected = item.Id.ToString() == selectedvalue ? true : false }); 
} 

ViewBag.ListOfCodes = list; 

na mój widok:

<%: Html.DropDownList("Codes", (List<SelectListItem>)ViewBag.ListOfCodes , new { style = "max-width: 600px;" })%> 

teraz, zanim dotrze on pogląd, "Wykaz" zapełnił je elementami i zaznaczył element, który jest już wybrany. ale gdy dojdzie do widoku, żadna z opcji nie jest zaznaczona jako wybrana.

moje pytanie brzmi, czy można użyć plecaka do przenoszenia przedmiotów, czy powinienem użyć innego medium? ponieważ usuwa wybraną flagę z opcji, jeśli używam jej w ten sposób.

+0

Czy możesz przerwać w kontrolerze i sprawdzić, czy co najmniej jeden element 'list' został oznaczony jako' Selected = true; '? Nie sądzę, że ViewBag miesza się z twoją listą. – StuartLC

+0

tak, zrobiłem to i zaznaczam właściwą opcję. – gdubs

Odpowiedz

21

Spróbuj tak:

ViewBag.ListOfCodes = new SelectList(mymodelinstance.Codes, "Id", "Name"); 
ViewBag.Codes = "C"; 

iw widoku:

<%= Html.DropDownList(
    "Codes", 
    (IEnumerable<SelectListItem>)ViewBag.ListOfCodes, 
    new { style = "max-width: 600px;" } 
) %> 

Aby to działało to oczywiście musi mieć element o id = "C" wewnątrz swojej kolekcji, jak poniżej:

ViewBag.ListOfCodes = new SelectList(new[] 
    { 
     new { Id = "A", Name = "Code A" }, 
     new { Id = "B", Name = "Code B" }, 
     new { Id = "C", Name = "Code C" }, 
    }, "Id", "Name"); 
+0

która część tego wybiera "Kod C"? – gdubs

+1

Ten: 'ViewBag.Codes =" C ";'. A ponieważ w widoku użyłeś Codes jako pierwszego argumentu do pomocnika 'DropDownList', wybierzesz wartość z ViewBag. Oczywiście rzeczy mogły być milion razy bardziej przejrzyste, gdybyś użył modelu widoku i silnie wpisanego pomocnika "DropDownListFor" i zapomniał o ViewBag, który zawsze polecam ludziom. –

+0

Zgadzam się, ja też bym to zrobił. ale w tym scenariuszu wartość z tej listy zostanie dołączona do innej wartości z innej listy rozwijanej, która zostanie zapisana w instancji. Szkoda, że ​​nie został zamodelowany inaczej .. – gdubs