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?
You mean client-side, in the browser?
var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;
The "SelectedValue" property is read-only. Setting it in the constructor is the only way.
Tor, the SelectList is an ASP.NET MVC construct used to create a drop-down list. Doing it your way should work too, but the SelectList should do it for you (and not in JS) if done properly.
I think you can do this in the controller. If you are going to render a drop down list with name/ID StateCode, then you can set the selected state using this code after the SelectList is created:
ViewData["StateCode"] = "VT";
It seems that the drop down list HTML helper looks for a ViewData item with the same name as the drop down list that's being created.
I don't think I like using this technique, but it does seem to work.
I do agree that the SelectList class is a little weak at the moment. I'd like to be able to create a SelectList and then select a value later by either value or text.
The SelectList object is readonly after it was created. if you want to select something you better do it like:
<%= Html.DropDownList("clientId", ViewData["clients"] as List<SelectListItem>,)%>
And in the code behind:
ViewData["clientId"] = "ASD"; //This should be the value of item you want to select
ViewData["clients"] = clientItemList; //List<SelectListItem>
Could do it pretty easy with jQuery;
$(function() {
$("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});
I needed a dropdown in a editable grid myself with preselected dropdown values. Afaik, the selectlist data is provided by the controller to the view, so it is created before the view consumes it. Once the view consumes the SelectList, I hand it over to a custom helper that uses the standard DropDownList helper. So, a fairly light solution imo. Guess it fits in the ASP.Net MVC spirit at the time of writing; when not happy roll your own...
public static string DropDownListEx(this HtmlHelper helper, string name, SelectList selectList, object selectedValue) { return helper.DropDownList(name, new SelectList(selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue)); }
I think you are fighting the framework. The data that goes 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 and then only initialise the SelectList(s) when you need to. An immediate benefit of this praxis is that it allows you to reuse your List for more than one dropdownlists, such as:
Country of birth Country of residence...
These SelectLists all use the Countries list of type List.
You can use your List 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 till you really need to spit it out. Ie, the last possible minute (LPM).
Andrew