gpt4 book ai didi

c# - 将 List 添加到 DropDownList 的最佳实践

转载 作者:太空宇宙 更新时间:2023-11-03 20:13:47 25 4
gpt4 key购买 nike

我的 Controller 如下所示:

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 是“最佳实践”,我听说过使用模型从中选择列表,我已经在 View 中添加了对模型的引用:

@model ExportCalculationSheetModel

如何在模型类中填充列表并在我的 View 中使用它?

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

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. 如何将模型页面中的列表连接到 View 中的下拉列表?

提前致谢!

最佳答案

唯一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被访问,关联的私有(private)变量,allCategories , 将为空,因此您的服务启动并获取类别列表。 Select用于将返回的类别转换为 SelectListItem 的集合秒。如果你的类别有类似 Id 的东西属性,您应该将其用于 Value而不是 Name .对 AllCategories 的任何后续访问将简单地返回存储在私有(private)中的值,而不会再次访问数据库。

额外的专业提示

如果您确实需要为这样的事情使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com