Am I right to think that there is no way to set the selected value in the C# class SelectList after it is created? Isn't that a bit silly?
I think you are fighting the framework. The data going into your views should be created at the Last Possible Minute (LPM).
Thinking this way, a SelectList
is a type to feed the DropDownList
HTML helper. It is NOT a place to store data while you decide how to process it.
A better solution would be to retrieve your data into a List<T>
and then initialize the SelectList
(s) when you need to. An immediate benefit of this practice is that it allows you to reuse your List<T>
for more than one DropDownList
, such as:
Country of birth
Country of residence
These SelectLists
all use the Countries list of type List<Country>
.
You can use your List<T>
at the 'last minute' like in this example:
public class TaxCheatsFormViewModel
{
private List<Country> countries { get; set; }
public TaxCheat Cheat { get; private set; }
public SelectList CountryOfBirth { get; private set; }
public SelectList CountryOfResidence { get; private set; }
public SelectList CountryOfDomicile { get; private set; }
public TaxCheatsFormViewModel(TaxCheat baddie)
{
TaxCheat = baddie;
countries = TaxCheatRepository.GetList<Country>();
CountryOfBirth = new SelectList(countries, baddie.COB);
CountryOfResidence = new SelectList(countries, baddie.COR);
CountryOfDomicile = new SelectList(countries, baddie.COD);
}
}
The point being that you should keep your data in a List<T>
till you really need to output it; the last possible minute (LPM).
I know it' an old question, but it might help someone out there. I did what looks to be closely like what Erik did. I just created a new SelectList from my existing one...
SelectList myList = GetMySelectList();
SelectListItem selected = myList.FirstOrDefault(x => x.Text.ToUpper().Contains("UNITED STATES"));
if (selected != null)
{
myList = new SelectList(myList, "value", "text", selected.Value);
}