Упрощение заполнения DropDownLists - PullRequest
0 голосов
/ 18 декабря 2011

В моем приложении 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%, что вышесказанное является хорошей идеей, я просто скопировал его из этого урока .

Тогда автор учебника будет выглядеть примерно так:

// 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] для вызова!так что я предполагаю, что он установил какой-то метод Extention в своем Домене ( плюс я понятия не имею, что такое отрицательный для ).

В любом случае, может кто-нибудь пожалуйстаПокажите мне лучший способ заполнить повторяющийся (часто используемый) DropDownList.

Любая помощь будет принята с благодарностью .

Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2011

Я думаю, вы можете загрузить NewPostVM.Languages таким образом:

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

Первый параметр конструктора SelectList должен быть IEnumerable "

0 голосов
/ 19 декабря 2011

ОК, так что примерно через час в чате с 3nigma мы разобрались. Я поделюсь этим с вами, товарищи по программированию.

У меня было решение с 2 проектами. Один держит мой домен, а другой - приложение MVC3. В проекте Domain создайте папку с именем [Extensions] (убедитесь, что вы не пишете это как Extensions, как я это сделал: D) и добавьте класс с именем, относящимся к сущности, о которой идет речь. Я назвал добытым [LanguageEntityExtension]

folder structure

Там последовал этот урок , и мой код выглядел так:

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] вручную, щелкнув правой кнопкой мыши папку «Ссылки» и добавив ее таким образом.

Теперь в своем контроллере я добавил соответствующий оператор using [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 за помощь.

0 голосов
/ 18 декабря 2011
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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...