【问题标题】:ASP.NET MVC Dropdown List From SelectList来自 SelectList 的 ASP.NET MVC 下拉列表
【发布时间】:2013-11-27 12:49:15
【问题描述】:

我正在我的控制器中构建以下SelectList

var u = new NewUser();

u.UserTypeOptions = new SelectList(new List<SelectListItem>
{
    new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
    new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
    new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
});

return u;

并像这样在我的视图上显示它:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions)

看起来我在应该是一个非常简单的下拉列表中为其提供了一组有效的SelectListItems,但我没有得到一个具有良好值和文本的有效&lt;option&gt; 列表,而是这样:

<select data-val="true" data-val-range="A user type must be selected." data-val-range-max="2" data-val-range-min="1" data-val-required="The UserType field is required." id="UserType" name="UserType" class="input-validation-error">
    <option>System.Web.Mvc.SelectListItem</option>
    <option>System.Web.Mvc.SelectListItem</option>
    <option>System.Web.Mvc.SelectListItem</option>
</select>

什么给了?据我所知,这应该可行。

【问题讨论】:

  • 你到底为什么要创建一个SelectList,然后再从它创建另一个SeelctList。并且设置SelectListItemSelected 属性同样没有意义-它被HtmlHelper 忽略-它的属性UserType 的值决定了选择的内容(唯一尊重Selected 属性的时间是在创建时未绑定到您的模型的下拉列表(例如@Html.DropDownList("NotAProperty", Model.UserTypeOptions)

标签: c# asp.net-mvc drop-down-menu


【解决方案1】:

您缺少在 SelectList 本身中设置 TextValue 字段。这就是为什么它对列表中的每个对象执行.ToString() 的原因。您可能会认为,鉴于它是 SelectListItem 的列表,它应该足够聪明地检测到这一点……但事实并非如此。

u.UserTypeOptions = new SelectList(
    new List<SelectListItem>
    {
        new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
        new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
        new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
    }, "Value" , "Text", 1);

顺便说一句,您可以使用任何类型的列表或数组...然后只需设置将充当文本和值的属性的名称。

我认为最好这样做:

u.UserTypeOptions = new SelectList(
    new List<SelectListItem>
    {
        new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
        new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
    }, "Value" , "Text");

我去掉了-1项,每一项的设置都选择了真/假。

那么,在你看来:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one")

这样,如果你设置了“Select one”项并且没有在SelectList中设置一项为选中,UserType将为空(UserType需要为int?)。

如果需要将 SelectList 项之一设置为选中,可以使用:

u.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected);

正如一位用户在 cmets 中解释的那样: 当使用DropDownListFor() 绑定到属性时,SelectList 构造函数的第 4 个选项将被忽略 - 它是属性的值决定了选择的内容。

【讨论】:

  • 使用new SelectList(...) 从第一个创建第二个相同的IEnumerable&lt;SelectListItem&gt; 只是毫无意义的额外开销。
  • 而你最后的 sn-p 完全是错误的。当使用DropDownListFor() 绑定到属性时,SelectList 构造函数的第 4 个选项将被忽略 - 它的属性值决定了选择的内容。
【解决方案2】:

用剃须刀试试这个

@{
    var selectList = new SelectList(
        new List<SelectListItem>
        {
            new SelectListItem {Text = "Google", Value = "Google"},
            new SelectListItem {Text = "Other", Value = "Other"},
        }, "Value", "Text");
}

然后

@Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" })

@Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" })

【讨论】:

    【解决方案3】:

    试试这个,只是一个例子:

    u.UserTypeOptions = new SelectList(new[]
        {
            new { ID="1", Name="name1" },
            new { ID="2", Name="name2" },
            new { ID="3", Name="name3" },
        }, "ID", "Name", 1);
    

    或者

    u.UserTypeOptions = new SelectList(new List<SelectListItem>
        {
            new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
            new SelectListItem { Selected = false, Text = "Homeowner", Value = "2"},
            new SelectListItem { Selected = false, Text = "Contractor", Value = "3"},
        },"Value","Text");
    

    【讨论】:

    • 似乎是开销最少的最佳选择。例如,上面的许多答案都希望您使用 List 并需要包含。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多