asp.net 将SelectListItem手动添加到要在DropDownListFor中使用的SelectList

ejk8hzay  于 2023-01-03  发布在  .NET
关注(0)|答案(5)|浏览(151)

创建SelecList时,我希望能够手动添加SelecListItem,为此,我使用以下代码:

List<SelectListItem> Provinces = new List<SelectListItem>();
Provinces.Add(new SelectListItem() { Text = "Northern Cape", Value = "NC" });
Provinces.Add(new SelectListItem() { Text = "Free State", Value = "FS" });
Provinces.Add(new SelectListItem() { Text = "Western Cape", Value = "WC" });

SelectList lstProvinces = new SelectList(Provinces);

而不是这个:

var lstProvinces = new SelectList(new[] { "Northern Cape", "Free State", "Western Cape" });

创建SelectList之后,我通过ViewBag将其传递给DropDownListFor:

Html.DropDownListFor(m => m.StartPointProvince, (SelectList)ViewBag.Provinces)

然而,当我使用第一个方法创建SelectList时,它不起作用-它将3个值添加到下拉列表中,但所有值都显示为:

  • 输出屏幕截图
    然而,当我使用第二种方法时,它工作得很好。我希望使用第一种方法,因为我希望能够指定每个项目的文本和值。
2ul0zpep

2ul0zpep1#

问题在于SelectList(IEnumerable) constructor doesn't accept SelectListItem 's(至少没有作为SelectListItem添加到它的Items集合中).它只是接受一些任意对象的集合,这些对象将用于生成完全不相关的内部SelectListItem集合。
如果需要,可以按以下方式使用SelectList(IEnumerable, string, string)构造函数:

List<SelectListItem> Provinces = new List<SelectListItem>();
Provinces.Add(new SelectListItem() { Text = "Northern Cape", Value = "NC" });
Provinces.Add(new SelectListItem() { Text = "Free State", Value = "FS" });
Provinces.Add(new SelectListItem() { Text = "Western Cape", Value = "WC" });

this.ViewBag.Provinces = new SelectList(Provinces, "Value", "Text");

这是可行的,但是不必要,因为你创建了复杂的SelectListItem项,而SelectList不会使用这些项--它只会把它们当作任何其他数据对象。
同样的,你也可以用其他更简单的类来代替SelectListItem

public class SelectListModel
{
    public String Text { get; set; }
    public String Value { get; set; }
}

...
Provinces.Add(new SelectListModel() { Text = "Northern Cape", Value = "NC" });
gstyhher

gstyhher2#

使用DropDownList并将其命名为与模型属性名称相同的名称。我的名称是"ItemType"

@Html.LabelFor(model => model.ItemType, new { @class = "control-label" })
     @Html.DropDownList("ItemType", (IEnumerable<SelectListItem>)ViewBag.ItemTypes, new { @class = "form-control" })
     @Html.ValidationMessageFor(model => model.ItemType, null, new { @class = "text-danger" })

x一个一个一个一个x一个一个二个x

mo49yndu

mo49yndu3#

您可以更改您的代码

SelectList lstProvinces = new SelectList(Provinces);

SelectList lstProvinces = new SelectList(Provinces, "Value", "Text");

它会正确显示省份。

syqv5f0l

syqv5f0l4#

您不需要使用SelectList
相反,将List<SelectListItem> Province放入ViewBag并返回ViewBag。然后在视图中放入:

@Html.DropDownList("Dropwonlist", (IEnumerable<SelectListItem>)ViewBag.YourData)
n3h0vuf2

n3h0vuf25#

考虑到关于这个主题的视图的数量,我认为它可能有助于其他人提供一些进一步的示例,说明您选择的选项取决于选择列表的所需内容。
我通常更喜欢在一个单独的类中保留选择下拉选项的分配,这样在创建更长的列表时更容易管理,在整个应用程序中使用同一类的选项也很方便。
C#类

public class CustomFormsSelectDropdownParams
{
    public static IEnumerable<SelectListItem> Example1ItemWidth { get; private set; }
    public static IEnumerable<SelectListItem> Example2ItemWidth { get; private set; }
    public static List<SelectListItem> Example3ItemWidth { get; private set; }

    static CustomFormsSelectDropdownParams()
    {
        // ---------
        // Exmaple 1
        // ---------
        // This is OK if you only have a
        // relatively small amount of options to write.
        Example1ItemWidth = new SelectListItem[]
        {
            // First item different to the remaining range.
            new SelectListItem ("100%", "100%"), 
            new SelectListItem ("5em", "5em"),
            new SelectListItem ("6em", "6em"),
            new SelectListItem ("7em", "7em"),
            new SelectListItem ("8em", "8em"),
            new SelectListItem ("9em", "9em"),
            new SelectListItem ("10em", "10em")
        };

        // ---------
        // Exmaple 2
        // ---------
        // This is more practical if you have a large amount of options.
        // NOTE: using this example doesnt allow us to insert any options
        // that are different from the rest, so limited use cases may apply.
        Example2ItemWidth = Enumerable.Range(1, 200).Select(x => new SelectListItem
        {
            Value = x.ToString() + "em",
            Text = x.ToString() + "em",
        });

        // ---------
        // Exmaple 3
        // ---------
        // This is more practical if you have a large amount of options.
        // This example also allows us to add an option that is a different
        // to the remaining options in the loop.

        // Our first item is bespoke so created seperately.
        var firstDefaultItem = new SelectListItem("100%", "100%");
        // Provides a range between 10 --> 200em
        var remainingItems = Enumerable.Range(10, 191).Select(x => new SelectListItem
        {
            Value = x.ToString() + "em",
            Text = x.ToString() + "em",
        });

        Example3ItemWidth = new List<SelectListItem>();
        // Add out first bespoke item.
        Example3ItemWidth!.Add(firstDefaultItem);
        // Add the remaining items in a loop.
        foreach (var item in remainingItems)
        {
            Example3ItemWidth.Add(new SelectListItem(item.Text, item.Value));
        }
    }
}

示例HTML代码:

<div class="container-fluid">
    <div class="row">
        <div class="mb-3 col-3" >
            <label class="form-label">Example 1</label>
            <select class="form-select" asp-items="Classes.CustomForms.CustomFormsSelectDropdownParams.Example1ItemWidth"></select>
        </div>
    </div>
    <div class="row">
        <div class="mb-3 col-3" >
            <label class="form-label">Example 2</label>
            <select class="form-select" asp-items="Classes.CustomForms.CustomFormsSelectDropdownParams.Example2ItemWidth"></select>
        </div>
    </div>
    <div class="row">
        <div class="mb-3 col-3" >
            <label class="form-label">Example 3</label>
            <select class="form-select" asp-items="Classes.CustomForms.CustomFormsSelectDropdownParams.Example3ItemWidth"></select>
        </div>
    </div>
</div>

页面上的所有三个选择下拉列表:

例一:

例二:

例三:

例3是一个困扰了我一段时间,我不知道如何创建一个选择选项列表,以及添加一些其他定制的选项在同一时间.如果我需要添加一些更多的额外besoke选项,那么我会简单地添加他们在我需要的任何顺序,无论是循环之前,之后或在多个循环之间.

相关问题