Как добавить статический список элементов в MVC Html.DropDownList()

StackOverflow https://stackoverflow.com/questions/867117

Вопрос

Я хотел бы назначить статический список элементов в SelectList() к Html.DropDownList() в ASP.NET MVC, какова наилучшая практика?

Я собирался попытаться найти способ использовать new SelectList(new {key = "value"}... но во-первых, это не сработало, и во-вторых, нарушу ли я здесь закон, если мой статический список будет объявлен в ViewData в любом случае и прошло как IList/IENumerable?

Это было полезно?

Решение 3

Хорошо, я решил последовать собственному совету, и это должно быть определено в контроллере:

К вашему сведению, я только что вернулся:

PageData data = new PageData()
           {
               Formats = new[]
                             {
                                 new { ID = "string", Name = "Text" },
                                 new { ID = "int", Name = "Numeric" },
                                 new { ID = "decimal", Name = "Decimal" },
                                 new { ID = "datetime", Name = "Date/Time" },
                                 new { ID = "timespan", Name = "Stopwatch" }
                             },
               .............

           };
return View(data);

...(игнорировать контекст) и на стороне просмотра ASPX:

<%= Html.DropDownList("type.field", new SelectList(ViewData.Model.Formats, "ID", "Name"...

Если у кого-то есть более оптимальный способ сделать это, я буду рад принять их ответ.

Другие советы

Рекомендуется не создавать SelectList в представлении.Вам следует создать его в контроллере и передать с помощью ViewData.

Пример:

  var list = new SelectList(new []
                                          {
                                              new {ID="1",Name="name1"},
                                              new{ID="2",Name="name2"},
                                              new{ID="3",Name="name3"},
                                          },
                            "ID","Name",1);
            ViewData["list"]=list;
            return View();

вы переходите к конструктору:объект IEnumerable, поле значения, текстовое поле и выбранное значение.

в представлении:

 <%=Html.DropDownList("list",ViewData["list"] as SelectList) %>

Все новички в MVC изначально избегают слова «М», но оно начинается в начале аббревиатуры MVC.Так что, возможно, просто возможно, вы захотите начать свое решение с Модели...просто говорю.

Не повторяйте себя (СУХОЙ).В конечном итоге вам придется скопировать и вставить «новый PageData()» в каждый контроллер, который передает список параметров в представление.Затем вам понадобится удалить или добавить опцию, и вам придется редактировать PageData каждого контроллера.

Более того, вы хотите набирать наименьший объем кода с наименьшим количеством излишне многословных слов «добавить», «новых», «IS» и «Имени».Поскольку в опции выбора (и/или в списке переключателей) есть только пара ключ-значение, используйте максимально легкую структуру данных, т.е.Словарь - в вашей модели.

Затем просто обратитесь к модели в контроллере и преобразуйте словарь в SelectList в представлении, используя DropDownListFor, содержащий лямбда-выражение LINQ.

Запуган?Ты не один.Я, конечно, был.Вот пример, который я использовал, чтобы выучить буквы М, В и С:

Модельная часть MVC:

using System.Web.Security;
using System.Collections.Generic;
using System.Text;
using System.Linq.Expressions;
using System.Web.Routing;
using System.Web.Helpers;
using System.Web.Mvc.Html;
using MvcHtmlHelpers;
using System.Linq;

// EzPL8.com is the company I work for, hence the namespace root. 
    // EzPL8 increases the brainwidths of waiters and bartenders by augmenting their "memories" with the identifies of customers by name and their food and drink preferences.
   // This is pedagogical example of generating a select option display for a customer's egg preference.  

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

        public MyEggs()  //constructor
        {
            Egg = new Dictionary<int, string>()
            {
                { 0, "No Preference"},  //show the complete egg menu to customers
                { 1, "I hate eggs"},    //Either offer an alternative to eggs or don't show eggs on a customer's personalized dynamically generated menu

                //confirm with the customer if they want their eggs cooked their usual preferred way, i.e.
                { 2, "Over Easy"},  
                { 3, "Sunny Side Up"},
                { 4, "Scrambled"},
                { 5, "Hard Boiled"},
                { 6, "Eggs Benedict"}
            };
    }
}

Контроллер теперь довольно прост: достаточно передать модель.Это позволяет избежать создания изолированной концепции, которая, вероятно, не изолирована только на одной странице:

public ActionResult Index()
{
   var model = new EzPL8.Models.MyEggs();
   return View(model);
}

Представление использует DropDownListFor (вместо DropDownList), и требуется выражение Lambda для строгой типизации при рефакторинге событий:

@Html.DropDownListFor(m => m.Egg, new SelectList( Model.Egg, "Key", "Value"))

Вуаля, полученный HTML:

<select id="Egg" name="Egg">
<option value="0">No Preference</option>
<option value="1">I hate eggs</option>
<option value="2">Over Easy</option>
<option value="3">Sunny Side Up</option>
<option value="4">Scrambled</option>
<option value="5">Hard Boiled</option>
<option value="6">Eggs Benedict</option>
</select>

Примечание:не запутайтесь в ЗНАЧЕНИИ в <option value="6">, который является ключом из словаря, из «Значения» в SelectList(), которое является текстом/заголовком (например,Яйца Бенедикт), который оказывается между тегами опций.

Вариант использования:Чтобы минимизировать трафик между приложением и базой данных, я создал статический список, чтобы избежать запроса к базе данных раскрывающегося списка, который редко, если вообще когда-либо, меняется.Однако перемены неизбежны, и через шесть месяцев посетитель ресторана моего клиента умрет;не из-за зеленой ветчины, а потому, что у них была аллергия на яйца, и повар смешал их с вафлями.

Ресторану необходимо немедленно обновить информацию о клиентах, чтобы включить в нее пищевую аллергию.Хотя они любят постоянных клиентов, их не устраивает, когда мертвые клиенты возвращаются в виде зомби, у которых нет возможности заплатить, потому что их кредитные карты были аннулированы.

Риторический вопрос:Должен ли я изменить все контроллеры и представления, связанные с предпочтениями клиентов в отношении яиц?Или просто вставить в модель {7, «Аллергия на яйца»}?

Еще один риторический вопрос:Разве омлеты не яйца?Хотите добавить {8, «Омлет, Западный»}, {9, «Омлет, Гриб-Фета-Шпинат»} один раз в модель, чтобы новые дополнения автоматически распространялись по всем раскрывающимся спискам во всех представлениях, которые их используют? ?

Итог(и) Вероятно, это намного больше, чем вы просили... но вы сказали MVC, а не только VC:
1.Используйте модель в *М*ВК.2.Используйте словарь в модели, когда список выбора основан не более чем на «первичном ключе» и заголовке.3.Если ваш статический список где-то не совпадает с таблицей поиска базы данных, ваше приложение, вероятно, не очень полезно.Когда вы добавляете параметр в статический список, скорее всего, вам также потребуется выполнить вставку в таблицу поиска, чтобы избежать ошибки целостности отношений первичного ключа/внешнего ключа с другими таблицами в базе данных.4.Используйте лямбда-выражения и строго типизированные структуры данных, чтобы избежать ошибок и получить поддержку опережающего ввода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top