Как написать простой Html.DropDownListFor ()?

133

В ASP.NET MVC 2 я хотел бы написать очень простой выпадающий список, который дает статические параметры. Например, я хотел бы предоставить выбор между «Красный», «Синий» и «Зеленый».

Rinesse
источник

Ответы:

188

См. Эту статью MSDN и пример использования здесь на переполнение стека .

Допустим, у вас есть следующий класс Linq / POCO:

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

И скажем, у вас есть следующая модель:

public class PageModel 
{
   public int MyColorId { get; set; }
}

И, наконец, допустим, что у вас есть следующий список цветов. Они могут быть получены из запроса Linq, из статического списка и т. Д .:

public static IEnumerable<Color> Colors = new List<Color> { 
    new Color {
        ColorId = 1,
        Name = "Red"
    },
    new Color {
        ColorId = 2,
        Name = "Blue"
    }
};

По вашему мнению, вы можете создать выпадающий список следующим образом:

<%= Html.DropDownListFor(n => n.MyColorId, 
                         new SelectList(Colors, "ColorId", "Name")) %>
Эван Нэгл
источник
1
это действительно ясно. Я хотел бы знать, где я должен поместить IEnumerable <Color> в мой код? Я знаю, что это кажется глупым как вопрос, но я очень потерян и новичок в этом: s
Rinesse
7
Не беспокойся, друг. Я знаю каково это. :) Как вы предложили в своем первоначальном вопросе, это статический список, который вы собираетесь создать в коде, или вы собираетесь извлекать этот список из базы данных?
Эван Нагл
статический список, который содержит 4 параметра, которые не
обрабатывают
6
Создайте статический класс с именем «HtmlLists» или что-то в этом роде. Поместите статический класс в пространство имен System.Web.Mvc. В своем статическом классе добавьте свой статический список цветов IEnumerable <Color>. Затем, по вашему мнению, вы можете ссылаться на него, вызывая HtmlLists.Colors. Надеюсь, что это имеет смысл. Дай мне знать. :)
Эван Нагл
2
Я не знал, как это сделать: '(... Я не знаю, куда поместить Color classe и HtmlLists (в папке моделей может быть?) И как ссылаться в представлении. Также не знаю, как поставить результат списка в аттрибуте viewModel .. я так растерялся: /
Rinesse
61
<%: 
     Html.DropDownListFor(
           model => model.Color, 
           new SelectList(
                  new List<Object>{ 
                       new { value = 0 , text = "Red"  },
                       new { value = 1 , text = "Blue" },
                       new { value = 2 , text = "Green"}
                    },
                  "value",
                  "text",
                   Model.Color
           )
        )
%>

или вы можете не писать классов, поместить что-то подобное прямо в представление.

Берат
источник
2
Я получаю сообщение об ошибке ниже, когда попробую ваш код: «Ссылка на объект не установлена ​​на экземпляр объекта».
Башар Абу Шамаа
12
плохая идея добавить модельную логику в ваш взгляд
Даниэль Тульп
34

Избегайте большого количества аппликатур, начиная со словаря в модели

namespace EzPL8.Models
{
    public class MyEggs
    {
        public Dictionary<int, string> Egg { get; set; }

        public MyEggs()
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},
                { 1, "I hate eggs"},
                { 2, "Over Easy"},
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };

    }


    }

В представлении преобразовать его в список для отображения

@Html.DropDownListFor(m => m.Egg.Keys,
                         new SelectList(
                             Model.Egg, 
                             "Key", 
                             "Value"))
Жюль Бартоу
источник
32

Привет, вот как я это сделал в одном проекте:

     @Html.DropDownListFor(model => model.MyOption,                
                  new List<SelectListItem> { 
                       new SelectListItem { Value = "0" , Text = "Option A" },
                       new SelectListItem { Value = "1" , Text = "Option B" },
                       new SelectListItem { Value = "2" , Text = "Option C" }
                    },
                  new { @class="myselect"})

Надеюсь, это кому-нибудь поможет. Спасибо

Мастер Программист
источник
12

Или, если это из контекста базы данных, вы можете использовать

@Html.DropDownListFor(model => model.MyOption, db.MyOptions.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }))
Джоэл Валунд
источник
22
Пожалуйста, не поощряйте такую ​​чушь. Если вам нравится ссылаться на свой контекст БД в ваших представлениях Razor, но для тех из нас, кто любит правильное создание программного обеспечения, тогда это ужасная идея. Свяжите свое представление Razor с классом модели представления, все данные, необходимые для представления, хранятся в экземпляре модели представления, созданном контроллером. Это одна из причин, по которой я ухожу от .Net, потому что слишком много ужасных разработчиков делают ужасные вещи со своим кодом, создавая огромные головные боли для всех остальных. Бьюсь об заклад, вы положили всю свою бизнес-логику в контроллеры
JBeckton
7
Во-первых, прошу прощения за грамматические исправления, так как английский не мой родной язык. Всегда приятно видеть, что кто-то делает такой продуманный комментарий, я приветствую вас, сэр, что вы нашли время, чтобы внести свой вклад. Также всегда обнадеживает то, что профессия разработчиков находится в таких же хороших руках, как и у вас, поскольку моя профессия не подойдет. Подобные твоему невежественному комментарию - вот почему я больше не публикую здесь. Могу ли я сообщить вам, что когда я писал это, я учился 8 месяцев и никогда раньше не занимался веб-разработкой. Я хотел поделиться другим подходом с теми небольшими знаниями, которые у меня были.
Joel Wahlund
7
Через 8 месяцев? Тогда зачем пытаться решать проблемы, если не умеешь? Мой комментарий далек от невежества, я вижу это изо дня в день. Вы должны начать учитывать объем ручной работы, которую вы обязываете своим коллегам. представьте, что у вас есть корпоративное приложение с сотнями представлений, и ваш технический директор хочет перейти на Oracle DB. Представьте себе буквальную стоимость рефакторинга всех представлений и контроллеров, использующих раскрывающиеся списки, только из-за одной строчки кода! Я не пытаюсь вас оскорбить, просто пытаюсь объяснить вам, как маленький дурной совет может иметь огромный эффект.
JBeckton
2
Не отличается от необходимости рефакторинга статических решений на основе перечислений. По крайней мере, это не было изменением кода каждый раз, когда бизнес хотел добавить цвет в список. Если бы больше людей думали о том, чтобы использовать базу данных, мир стал бы лучше.
m12lrpv
3
Ну, эта тема вызывает улыбку на моем лице, когда я посещаю его время от времени. Я понимаю, что точка @SeanT немного лучше. Я думаю, я просто почувствовал атаку в целом, когда пытался помочь. Сейчас я предпочитаю, чтобы все было разделено слоями и не позволяло ничему касаться вида, если он не разделен на ViewModels. Просто мне нравится делать это самому. Я ценю, что m12lrpv принял меня в защиту, ты :-)
Джоэл Уолунд
7

С «Пожалуйста, выберите один пункт»

@Html.DropDownListFor(model => model.ContentManagement_Send_Section,
  new List<SelectListItem> { new SelectListItem { Value = "0", Text = "Plese Select one Item" } }
    .Concat(db.NameOfPaperSections.Select(x => new SelectListItem { Text = x.NameOfPaperSection, Value = x.PaperSectionID.ToString() })),
  new { @class = "myselect" })  

Происходит из кодов: Мастер-программист && Джоэл Wahlund ;
Ссылка King: https://stackoverflow.com/a/1528193/1395101 JaredPar ;

Спасибо, главный программист && Joel Wahlund && JaredPar ;

Удачи друзья.

Амин Гадери
источник
1
@using (Html.BeginForm()) {
    <p>Do you like pizza?
        @Html.DropDownListFor(x => x.likesPizza, new[] {
            new SelectListItem() {Text = "Yes", Value = bool.TrueString},
            new SelectListItem() {Text = "No", Value = bool.FalseString}
        }, "Choose an option") 
    </p>
    <input type = "submit" value = "Submit my answer" />
} 

Я думаю, что этот ответ похож на ответ Берата в том, что вы помещаете весь код для вашего DropDownList прямо в представление. Но я думаю, что это эффективный способ создания выпадающего списка ay / n (логический), поэтому я хотел поделиться им.

Некоторые заметки для начинающих:

  • Не беспокойтесь о том, как называется «x» - он создается здесь впервые и не ссылается ни на что другое где-либо еще в приложении MVC, так что вы можете называть его как хотите - «x», "модель", "м" и т. д.
  • В раскрывающемся списке пользователи будут видеть заполнитель «Выберите вариант», так что вы можете изменить его, если хотите.
  • Перед раскрывающимся списком есть небольшой текст, в котором говорится: «Любишь пиццу?»
  • Это должен быть полный текст для формы, включая кнопку отправки, я думаю

Надеюсь, это кому-то поможет,

user5138047
источник