添加列表的最佳实践<;字符串>;到DropDownList

本文关键字:字符串 gt DropDownList 列表 lt 最佳 添加 | 更新日期: 2023-09-27 18:27:43

我的控制器如下所示:

var _engine = new NopEngine();
            var categoryService = _engine.Resolve<ICategoryService>();
            var allCategory = categoryService.GetAllCategories();
            List<string> ConvertedList = new List<string>();
            for (int i = 0; i < allCategory.Count; i++)
            {
                ConvertedList.Add(allCategory[i].Name);
            }
            //fill the viewbag
            ViewBag.CategoryList = ConvertedList;
            return View("Nop.Plugin.Misc.ExportAttributes.Views.MiscExportAttributes.ExportCalculationSheet");

所以基本上,我用字符串列表填充ViewBag。

我的观点如下:

@{
    Layout = "";
}
@using Telerik.Web.Mvc.UI;
@model ExportCalculationSheetModel
@using Nop.Plugin.Misc.ExportAttributes.Models;
@using Nop.Web.Framework;
@using Nop.Core.Domain.Catalog;
@using (Html.BeginForm())
{
    <table class="adminContent">
        <tr>
            <td colspan="2">
                <b>Filter op Categorie:</b>
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.searchCategory):
            </td>
            <td class="adminData">
                @Html.DropDownListFor(x => x.searchCategory, new SelectList(ViewBag.CategoryList, "Name"))
            </td>
        </tr>
</table>

这样,DropDownList就会填充正确的值。但我不认为ViewBag是"最佳实践",我听说过使用模型来选择列表,我已经在视图中添加了对模型的引用:

@model ExportCalculationSheetModel

如何在模型类中填写列表并在视图中使用它?

我已经尝试过用以下方式填充模型类,但没有成功:

public List<string> AllCategories
        {
            get
            {
                return AllCategories;
            }
            set
            {
                var _engine = new NopEngine();
                var categoryService = _engine.Resolve<ICategoryService>();
                var allCategory = categoryService.GetAllCategories();
                List<string> ConvertedList = new List<string>();
                for (int i = 0; i < allCategory.Count; i++)
                {
                    ConvertedList.Add(allCategory[i].Name);
                }
                AllCategories = ConvertedList;
            }
        }

所以两个主要问题是:

  1. 如何填写模型页上的列表?

  2. 如何将模型页面上的列表连接到视图中的下拉列表?

提前感谢!

添加列表的最佳实践<;字符串>;到DropDownList

DropDownListFor唯一需要的是一个IEnumerable<SelectListItem>(即,它可以是一个列表/集合/可查询的等等)。现在的问题是,你只需要一个列表string而不是SelectListItem。这很容易通过一点LINQ傅来弥补:

@Html.DropDownListFor(x => x.searchCategory, Model.AllCategories.Select(m => new SelectListItem { Value = m, Text = m }))

然而,更好的方法是简单地让AllCategories立即返回一个SelectListItem的列表(假设它只用于填充下拉列表)。

private IEnumerable<SelectListItem> allCategories;
public IEnumerable<SelectListItem> AllCategories
{
    get
    {
        if (allCategories == null)
        {
            var _engine = new NopEngine();
            var categoryService = _engine.Resolve<ICategoryService>();
            allCategories = categoryService.GetAllCategories().Select(m =>
                new SelectListItem { Value = m.Name, Text = m.Name });
        }
        return allCategories;
    }
    // You don't need a setter
}

第一次访问AllCategories时,关联的私有变量allCategories将为null,因此您的服务将启动,并获取类别列表。Select用于将返回的类别强制转换为SelectListItems的集合。如果您的类别具有类似Id的属性,则应将其用于Value而不是NameAllCategories的任何后续访问都将简单地返回存储在私有中的值,而不会再次访问数据库。

奖励专业提示

如果您确实需要使用for循环来执行类似的操作,则不需要创建新列表,在循环中向列表中添加项目,然后返回该列表。只使用yield更容易。例如:

public IEnumerable<int> Numbers
{
    for (int i = 0; i < 10; i++)
    {
        yield return i;
    }
}

更改

List<string> ConvertedList = new List<string>();

List<SelectList> ConvertedList = new List<SelectList>();

不需要循环。可以直接将数据库返回列表值添加到ConvertedList

看看这个样品将数据绑定到DropDownList MVC Razor

这是一个很好的样本

也许你可以试试这个:

从模型中的字典开始

    public class YourOptions
    {
        public Dictionary<int, string> Option { get; set; }
        public YourOptions()
        {
            Option = new Dictionary<int, string>()
            {
                //Here you should put your code, this is an example
                { 0, "Option 1"},
                { 1, "Option 2"},
                { 2, "Option 3"},
                { 3, "Option 4"},
                { 4, "Option 5"},
                //Here you should put your code, this is an example
            };
    }

在视图中

@Html.DropDownListFor(model => model.Option.Keys,
                         new SelectList(
                             Model.Option, 
                             "Key", 
                             "Value"))

抱歉我英语不好!我希望这对你有帮助!