我的控制器如下所示:

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


因此,两个主要问题是:


如何在模型页面上填写列表?
如何将模型页面上的列表连接到视图上的下拉列表?


提前致谢!

最佳答案

DropDownListFor唯一需要的是一个IEnumerable<SelectListItem>(即可以是列表/集合/可查询的等)。现在的问题是,您只是有一个列表string而不是SelectListItem。可以用一些LINQ-fu来轻松补救:

@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用于将返回的类别转换为SelectListItem的集合。如果类别具有类似Id的属性,则应将其用于Value而不是NameAllCategories的任何后续访问将仅返回存储在私有文件中的值,而无需再次访问数据库。

奖金专业提示

如果实际上确实需要使用for循环进行类似的操作,则无需创建新列表,无需在循环中将项目添加到列表中,然后返回该列表。仅使用yield更容易。例如:

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

关于c# - 将List <string>添加到DropDownList的最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18234430/

10-12 15:33