31

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

4

10 回答 10

19

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

以这种方式思考,aSelectList是一种用于提供DropDownListHTML 帮助器的类型。在您决定如何处理数据时,它不是存储数据的地方。

更好的解决方案是将数据检索到 a 中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)。

于 2010-02-12T16:48:26.990 回答
4

因为这在谷歌中是一个很高的结果,所以我提供了我发现在这里工作的东西(尽管年龄很大):

如果您使用的是强类型视图(即模型具有分配的类型),则提供给 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。

于 2011-04-09T02:06:23.253 回答
4

我知道这是一个老问题,但它可能会帮助那里的人。我做了看起来与 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);
}
于 2012-09-05T17:52:19.947 回答
3

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

Tor,SelectList 是一个 ASP.NET MVC 构造,用于创建下拉列表。以你的方式做也应该有效,但如果做得好,SelectList 应该为你做(而不是在 JS 中)。

于 2008-11-19T13:49:50.503 回答
1

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

ViewData["StateCode"] = "VT";

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

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

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

于 2009-02-01T15:26:18.293 回答
0

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

var select = document.getElementById('mySelect');
select.options[newIndex].selected = true;
于 2008-11-19T13:44:13.683 回答
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>
于 2009-03-12T03:33:14.200 回答
0

用 jQuery 可以很容易地做到这一点;

$(function() {
    $("#myselectlist option[@value='ItemToSelectValue'].attr('selected', 'true');
});
于 2009-08-27T19:05:12.203 回答
0

我自己需要一个带有预选下拉值的可编辑网格中的下拉列表。Afaik,选择列表数据由控制器提供给视图,因此它是在视图使用它之前创建的。视图使用 SelectList 后,我​​将其交给使用标准 DropDownList 帮助器的自定义帮助器。所以,一个相当轻的解决方案imo。在撰写本文时,猜测它符合 ASP.Net MVC 精神;不开心的时候自己滚……

公共静态字符串 DropDownListEx(此 HtmlHelper 助手,字符串名称,SelectList selectList,对象 selectedValue)
{
    return helper.DropDownList(name, new SelectList(selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue));
}
于 2009-11-07T22:07:31.320 回答
0

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

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

@Html.DropDownListFor(x => myViewModelFieldName, new SelectList(Model.MyRawSelectListFromMyViewModel.Select(x=> new {x.Value, x.Text}), "Value", "Text", TheValueYouWantToSelect))
于 2013-04-10T05:46:33.307 回答