添加列表的最佳实践<;字符串>;到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;
}
}
所以两个主要问题是:
如何填写模型页上的列表?
如何将模型页面上的列表连接到视图中的下拉列表?
提前感谢!
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
用于将返回的类别强制转换为SelectListItem
s的集合。如果您的类别具有类似Id
的属性,则应将其用于Value
而不是Name
。AllCategories
的任何后续访问都将简单地返回存储在私有中的值,而不会再次访问数据库。
奖励专业提示
如果您确实需要使用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"))
抱歉我英语不好!我希望这对你有帮助!