我的控制器如下所示:
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");
所以基本上我用View字符串填充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是“最佳实践”,我听说过使用模型从中选择List,我已经在视图中添加了对模型的引用:
@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;
}
}
所以两个主要问题是:
如何在模型页面填写列表?
如何将我的模型页面上的列表连接到我视图中的下拉列表?
提前致谢!
答案 0 :(得分:2)
更改
List<string> ConvertedList = new List<string>();
到
List<SelectList> ConvertedList = new List<SelectList>();
不需要循环。您可以直接将数据库返回列表值添加到ConvertedList
看看这个样本 Binding Data To DropDownList MVC Razor
这是一个很好的sample
答案 1 :(得分:2)
DropDownListFor
唯一需要的是IEnumerable<SelectListItem>
(即,可以是列表/集合/可查询/等)。现在的问题是,您只需拥有一个列表string
而不是SelectListItem
。用一点LINQ-fu很容易解决这个问题:
@Html.DropDownListFor(x => x.searchCategory, Model.AllCategories.Select(m => new SelectListItem { Value = m, Text = m }))
然而,更好的方法是简单地让AllCategories
返回SelectListItem
s-off-the-bat的列表(假设它仅用于填充下拉列表)。
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
的任何后续访问都将返回存储在私有中的值,而不会再次访问数据库。
Bonus Pro提示
如果你确实需要为这样的事情使用for循环,则不需要创建新列表,将项添加到循环中的列表,然后返回该列表。使用yield
更容易。例如:
public IEnumerable<int> Numbers
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
答案 2 :(得分:1)
可能你可以试试这个:
从模型中的词典开始
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"))
抱歉我的英语不好!我希望这能帮到你!