实例化后在SelectList中设置选定的值

时间:2008-11-19 13:16:24

标签: c# .net asp.net-mvc selectlist

我是否认为在创建C#类SelectList后无法设置所选值? 这不是有点傻吗?

10 个答案:

答案 0 :(得分:19)

我认为你正在与框架作斗争。进入视图的数据应在最后可能的分钟(LPM)中创建。

以这种方式思考,SelectList是一种提供DropDownList HTML帮助程序的类型。在您决定如何处理数据时,它不是存储数据的地方。

更好的解决方案是将您的数据检索到List<T>,然后在需要时初始化SelectList(s)。这种做法的直接好处是,它允许您重复使用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)。

答案 1 :(得分:4)

因为这在谷歌这么高的成绩,我提供了我在这里工作的东西(尽管年龄):

如果您使用的是强类型视图(即模型具有指定的类型),则提供给SelectList的构造函数的SelectedValue将被用于页面模型的对象的值覆盖。

这在编辑页面上运行良好,但在想要预选特定值时不适用于Create,因此一种解决方法就是在作为模型传递给视图的默认构造对象上分配正确的值。 e.g。

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的值。

答案 2 :(得分:4)

我知道这是一个老问题,但它可能会帮助那些人。我的表现与Erik的表现非常接近。我刚从现有的SelectList中创建了一个新的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);
}

答案 3 :(得分:3)

“SelectedValue”属性是只读的。在构造函数中设置它是唯一的方法。

Tor,SelectList是用于创建下拉列表的ASP.NET MVC构造。按照自己的方式进行操作也应该有效,但如果正确完成,SelectList应该为您(而不是JS)执行此操作。

答案 4 :(得分:1)

我认为你可以在控制器中执行此操作。如果要使用名称/ ID StateCode呈现下拉列表,则可以在创建SelectList后使用此代码设置所选状态:

ViewData [“StateCode”] =“VT”;

似乎下拉列表HTML帮助器查找的ViewData项与正在创建的下拉列表同名。

我认为我不喜欢使用这种技术,但似乎确实有用。

我确实认为SelectList类目前有点弱。我希望能够创建一个SelectList,然后通过值或文本选择一个值。

答案 5 :(得分:0)

你的意思是客户端,在浏览器中?

var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;

答案 6 :(得分:0)

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>

答案 7 :(得分:0)

使用jQuery可以轻松完成;

$(function() {
    $("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});

答案 8 :(得分:0)

我需要使用预先选定的下拉值在可编辑网格中下拉。 Afaik,选择列表数据由控制器提供给视图,因此它在视图消耗之前创建。一旦视图使用了SelectList,我就把它交给使用标准DropDownList帮助器的自定义帮助器。所以,一个相当轻松的解决方案imo。在编写本文时,猜测它符合ASP.Net MVC精神;当不高兴自己滚动...

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));
}

答案 9 :(得分:0)

我同意@awrigley和其他人的意见,当你有一个下拉列表时,通常情况下使用selectlist构造函数加载所选值会更好。但是,有时需要在视图上设置所选值,例如当您有一个具有n个相同下拉列表的页面时。由于在控制器中创建这样的集合是不切实际的,甚至可能事先不知道需要多少下拉列表,更好的方法是在viewmodel中创建一个实例作为模板,没有选择的值集,然后动态创建其余的动态地在视图上。

当孩子们需要下拉菜单时,在编辑视图中迭代子项目列表时,我会遇到这种情况。在这种情况下,您可以使用一行代码执行此操作:

@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))