将List <string>添加到DropDownList </string>的最佳实践

时间:2013-08-14 14:25:29

标签: c# asp.net-mvc visual-studio nopcommerce

我的控制器如下所示:

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

所以两个主要问题是:

  1. 如何在模型页面填写列表?

  2. 如何将我的模型页面上的列表连接到我视图中的下拉列表?

  3. 提前致谢!

3 个答案:

答案 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而不是NameAllCategories的任何后续访问都将返回存储在私有中的值,而不会再次访问数据库。

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"))

抱歉我的英语不好!我希望这能帮到你!