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


133

В ASP.NET MVC 2, я хотів би написати дуже простий спадний список, який дає статичні параметри. Наприклад, я хотів би надати вибір між "Червоним", "Синім" та "Зеленим".

Відповіді:


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 варіанти, не гортати базу даних
Rinesse,

6
Створіть статичний клас під назвою "HtmlLists" або щось подібне. Розмістіть статичний клас у просторі імен System.Web.Mvc. У свій статичний клас додайте свій статичний список кольорів IEnumerable <Color> Colors. Потім, на ваш погляд, ви можете посилатися на нього, зателефонувавши до HtmlLists.Colors. Сподіваюся, що це має сенс. Дай мені знати. :)
Еван Нагле

2
Я не знав, як це зробити: '(... Я не знаю, куди поставити кольоровий клас та HtmlLists (у папці моделей може бути?) І як звертатися до перегляду. Aloso a dont know how to put результат прослуховування в атрибуті виду Модель .. Я так заплутався: /
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
погана ідея додати логіку моделі до вашого погляду
Daniël Tulp

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
Будь ласка, не заохочуйте подібні дурниці. Якщо вам подобається посилатися на ваш db-контекст у поглядах на Razor, що є на вас, але для тих із нас, хто любить будувати програмне забезпечення правильним способом, то це жахлива ідея. Прив’яжіть свій погляд Бритви до класу моделі перегляду, будь-які дані, необхідні для подання, зберігаються в екземплярі моделі перегляду, створеної контролером. Це є причиною того, що я відволікаюсь від .Net, занадто багато жахливих розробників роблять жахливі речі зі своїм кодом, створюючи величезні головні болі для всіх інших. Надіюсь, ви вкладете всю свою ділову логіку у свої контролери!
JBeckton

7
По-перше, вибачте за будь-які вкраплення граматики, оскільки англійська мова не є моєю першою мовою. Завжди приємно бачити, як хтось зробив такий продуманий коментар, я аплодую вам, пане, що ви знайшли час, щоб зробити свій внесок. Це також завжди запевняє, що професія розробників знаходиться в таких хороших руках, як ваша, оскільки моя не обійдеться. Подобається ваш неосвічений коментар, чому я більше ніколи не публікую тут. Чи можу я повідомити вам, що коли я писав це, я навчався 8 місяців і ніколи раніше не торкався веб-розробки. Я хотів поділитися іншим підходом до тих невеликих знань, які я мав.
Joel Wahlund

7
8 місяців у? Тоді навіщо намагатися вирішувати проблеми, коли ви не могли вміти? Мій коментар далекий від необізнаності, я бачу цей матеріал день у день. Ви повинні почати розглядати обсяг ручної роботи, яку ви зобов’язуєте своїм колегам. уявіть, що у вас є корпоративна програма із сотнями переглядів, і ваш CTO хоче перейти на DB Oracle. Уявіть буквальну вартість рефакторингу всіх переглядів та контролерів, які використовують випадаючі списки саме через ваш один рядок коду! Я не намагаюся образити вас, просто намагаюся пояснити вам, як невелика погана порада може мати величезні наслідки.
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" })  

Отриманий з кодів: Майстер-програміст && Joel Wahlund ;
Посилання на короля: 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", 'модель', 'm' тощо.
  • Заповнювач, який користувачі побачать у випадаючому списку, - це "Оберіть варіант", тож ви можете змінити це, якщо хочете.
  • Перед падінням внизу є текст, який говорить "Чи любите ви піцу?"
  • Я думаю, це повинен бути повний текст для форми, включаючи кнопку для надсилання

Сподіваюся, це допоможе комусь,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.