使DropDownLists更容易填充

时间:2011-12-18 13:06:31

标签: asp.net-mvc-3 drop-down-menu entity-framework-4.1

在我的MVC3应用程序中,我有几个创建表单,它们都有一个共同点,那就是用于选择语言的DropDownList。

两天前,我了解到将整个实体(或它们的列表)发送到视图并不是一个好主意。最好通过ViewModels发送属性。

所以在我的ViewModel中,为了处理DropDownList,我有以下内容:

// Properties for Language DropDownList
[Required(ErrorMessage = "Language is Required")]
public int SelectedLanguageId { get; set; }
public IEnumerable<SelectListItem> Languages { get; set; }

我还在学习网页开发,我并不是100%确定以上是个好主意,我只是从this tutorial复制了它。

那么教程作者的作用是这样的:

// GET: Post/Create
public ActionResult Create()
{
    var vm= new NewPostVM();
    var langs = languagesRepository.Languages.ToList();
    vm.Languages = langs.ToSelectListItems(-1);
    if (langs.Count() == 0)
        return RedirectToAction("Index", "Language");
    return View("Create", viewModel);
}

事情是我没有[ToSelectListItems]方法来调用!所以我猜他已经在他的域上实施了某种扩展方法(加上我不知道负面的是什么)。

在任何情况下,有人可以告诉我填充重复(常用)DropDownList的最佳方法。

非常感谢任何帮助

谢谢。

3 个答案:

答案 0 :(得分:0)

public ActionResult Create()
{
    var vm= new NewPostVM();
    var langs = languagesRepository.Languages.ToList();
    vm.Languages = langs; //assign the languages list to the model property
    if (langs.Count() == 0)
        return RedirectToAction("Index", "Language");
    return View("Create", vm); // pass the model that you have created
}

答案 1 :(得分:0)

我认为你可以这样加载NewPostVM.Languages

var vm = new SelectList(languagesRepository.Languages.ToList(), "idLang", "Name");

SelectList构造函数的第一个参数只需要是IEnumerable

答案 2 :(得分:0)

好的,所以在与3nigma聊天约一个小时后,我们发现了。我会和你的同事一起分享。

我有2个项目的解决方案。一个持有我的域名,另一个持有我的MVC3应用程序。在Domain项目中创建一个名为[Extensions]的文件夹(确保你没有像我那样拼写Extentions:D)并添加一个类,命名与问题中的Entity相关的内容。我命名已开采[LanguageEntityExtension]

folder structure

在那里跟随this tutorial,并让我的代码看起来像:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.WebPages.Html;
using PostssDomain.Entities;

namespace PostsDomain.Extensions
{
    public static class LanguageEntityExtension
    {
        public static IEnumerable<SelectListItem> ToSelectListItems<T>(this IList<T> langeuageEntities) where T : Language
        {
             return ToSelectListItems((IEnumerator<Language>)langeuageEntities.GetEnumerator());
        }

        public static IEnumerable<SelectListItem> ToSelectListItems(this IEnumerator<Language> langeuageEntities)
        {
            var items = new HashSet<SelectListItem>();

            while (langeuageEntities.MoveNext())
            {
                var item = new SelectListItem();
                var entity = langeuageEntities.Current;

                item.Value = entity.Id.ToString();
                item.Text = entity.Name.ToString();

                items.Add(item);
            }

            return items;
        }
    }
}

这里有几点,确保你不要忘记这些词[静态],并确保你引用(使用语句)库[System.Web.WebPages.Html; ]和 [System.Web.Mvc; ]。您可能需要手动添加对[System.Web.WebPages.dll]的引用,方法是右键单击References文件夹并以此方式添加。

现在,在我的控制器中,我添加了相关的using语句[使用PostsDomain.Extensions; ]然后我能够做到以下几点:

var langs = languagesRepository.Languages.ToList();
vm.Languages = langs.ToSelectListItems();

在使用Extension方法之前,我没有。就是这样。然后在显示DropDownListFor的视图中,使用以下格式:

@Html.DropDownListFor(x => x.SelectedLanguageId, new SelectList(Model.Languages, "value", "text"))

请注意“值”和“文字”。

就是这样。一切都很好。

再次感谢3nigma的帮助。

相关问题