我是否认为在创建C#类SelectList之后无法设置所选值?这不是很傻吗?
我认为您正在与框架进行斗争。进入您视图的数据应该在最后可能的分钟(LPM)处创建。
以这种方式思考,SelectList
是用于提供DropDownList
HTML帮助器的类型。在决定如何处理数据时,这里不是存储数据的地方。
更好的解决方案是将数据检索到List<T>
中,然后在需要时初始化SelectList
。这种做法的直接好处是,它允许您将List<T>
重复使用多个DropDownList
,例如:
Country of birth
Country of residence
这些SelectLists
全部使用类型为List<Country>
的国家/地区列表。
您可以在“最后一刻”使用您的List<T>
,如本例所示:
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);
}
}
关键是您应该将数据保留在List<T>
中,直到您真正需要输出为止;最后可能的分钟(LPM)。
我同意@awrigley和其他人的观点,在通常情况下,只有一个dropdownlist时,最好使用selectlist构造函数加载所选值。但是,有时候,您需要在视图上设置选定的值,例如,当您的页面具有n个相同的下拉菜单时。由于在控制器中创建这样的集合是不切实际的,甚至可能事先都不知道您需要多少个下拉列表,因此更好的方法是在视图模型中创建一个实例作为模板,不设置选定值,然后动态创建其余实例。动态地在视图上。
当孩子需要下拉菜单时,我会在编辑视图上的子项目列表中进行迭代时经常遇到此问题。在这种情况下,您可以使用一行代码来做到这一点:
@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))
您可以通过将默认值分配给与下拉列表关联的模型属性来在Controller中设置默认值。
在模型中:
public class myThing
{
public string SomeProperty { get; set; }
public IEnumerable<SelectListItem> MyDropDownList { get; set; }
//...and then do something to populate the select list
}
控制器:
var myThing = new Thing();
myThing.SomeProperty = "Default";
return View(myThing);
然后在视图中:
@Html.DropDownListFor(model => model.SomeProperty, Model.MyDropDownList)
因为这在Google中取得了很高的成绩,所以我提供了我发现在这里工作的内容(尽管年龄):
如果使用的是强类型视图(即模型具有指定的类型,则提供给SelectList的构造方法的SelectedValue将被用于页面模型的对象的值覆盖。
这在编辑页面上效果很好,但是当您要预选择特定值时不适用于创建,因此一种解决方法是简单地为作为模型传递给视图的默认构造对象分配正确的值。例如
var model = new SubjectViewModel()
{
Subject = new Subject(),
Types = data.SubjectTypes.ToList()
}
model.Subject.SubjectType = model.Types.FirstOrDefault(t => t.Id == typeId);
ViewData.Model = model;
return View();
所以我的“创建”视图中的代码如下:
Html.DropDownListFor(model => model.Subject.SubjectTypeId, new SelectList(model.Types, "Id", "Name"))
返回具有我在列表中指定为SelectedValue的值的下拉列表。
我知道这是一个老问题,但这可能会帮助某个人。我做了看起来很像Erik的事情。我刚刚从现有的列表中创建了一个新的SelectList ...
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);
}
“ SelectedValue”属性是只读的。在构造函数中设置它是唯一的方法。
Tor,SelectList是用于创建下拉列表的ASP.NET MVC构造。以您的方式执行此操作也应该可行,但如果正确完成,则SelectList应该为您执行此操作(而不是在JS中)。
我认为您可以在控制器中执行此操作。如果要使用名称/ ID StateCode呈现下拉列表,则可以在创建SelectList之后使用此代码设置所选状态:
ViewData [“ StateCode”] =“ VT”;
似乎下拉列表HTML帮助程序正在查找与正在创建的下拉列表同名的ViewData项。
我认为我不喜欢使用这种技术,但是它确实有效。
我确实同意SelectList类目前有点弱。我希望能够创建一个SelectList,然后再通过值或文本选择一个值。
您的意思是客户端,在浏览器中?
var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;
SelectList对象在创建后是只读的。如果您想选择某些东西,最好这样做:
<%= Html.DropDownList("clientId", ViewData["clients"] as List<SelectListItem>,)%>
以及后面的代码:
ViewData["clientId"] = "ASD"; //This should be the value of item you want to select
ViewData["clients"] = clientItemList; //List<SelectListItem>
可以用jQuery轻松完成;
$(function() {
$("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});
我本人需要在可编辑网格中使用预先选择的下拉值来创建下拉菜单。 Afaik,选择列表数据是由控制器提供给视图的,因此它是在视图使用它之前创建的。视图使用了SelectList之后,我将其交给使用标准DropDownList帮助器的自定义帮助器。因此,一个相当轻便的解决方案imo。猜想它在撰写本文时符合ASP.Net MVC精神;不开心的时候自己动手...
公共静态字符串DropDownListEx(此HtmlHelper帮助器,字符串名称,SelectList selectList,对象selectedValue){返回helper.DropDownList(名称,新的SelectList(selectList.Items,selectList.DataValueField,selectList.DataTextField,selectedValue)));}