我的控制器如下所示:
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
而不是Name
。 AllCategories
的任何后续访问将仅返回存储在私有文件中的值,而无需再次访问数据库。奖金专业提示
如果实际上确实需要使用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/