Динамические выпадающие списки select mvc c примеры. Бесповоротность бесповоротный. Визуализируем данные представления

Я создаю следующий SelectList в своем контроллере.

Var u = new NewUser(); u.UserTypeOptions = new SelectList(new List { new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, }); return u;

И показывая его на моем представлении следующим образом:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions)

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

System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem

Что дает? Насколько я могу судить, это должно сработать.

3 ответов

Вам не удалось установить, в каком поле находится Текст и Значение в самом SelectList. Вот почему он имеет.ToString() для каждого объекта в списке. Вы могли подумать, что, учитывая, что это список SelectListItem , он должен быть достаточно умным, чтобы обнаружить это... но это не так.

{ new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"}, new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, }, "Value" , "Text", 1);

Кстати, вы можете использовать список массивов любого типа..., а затем просто указать имя свойств, которые будут действовать как текст и значение.

Я думаю, что лучше сделать это вот так:

U.UserTypeOptions = new SelectList(new List { new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()}, new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()}, }, "Value" , "Text");

Я удалил элемент -1, а для каждого элемента выбрано значение true/false.

Затем, на ваш взгляд:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one")

Таким образом, если вы установите элемент "Выбрать один", и вы не установите один элемент, выбранный в SelectList, UserType будет пустым (UserType должен быть int?).

Если вам нужно установить один из выбранных элементов SelectList, вы можете использовать:

U.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected);

Просто попробуйте это в бритве

@{ var selectList = new SelectList(new List { new SelectListItem {Text = "Google", Value = "Google"}, new SelectListItem {Text = "Other", Value = "Other"}, }, "Value", "Text"); } @Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" })

@Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" })

How to use Asp.Net List

The Collection classes are a set of classes designed specifically for grouping together objects and performing tasks on them. The basic functionality of collection classes are Adding elements to the Collection, Removing elements from the collection, Obtaining number of elements in the collection atc. List class is a Collection member and defined in the System.Collections.Generic namespace.

The C# List class represents a strongly typed list of objects that can be accessed by index. Elements in the List can be accessed using an integer index. Indexes in this collection are zero-based.

The parameter T is the type of elements in the list.

Add items in List collection ?

Add Integer values in the List collection

C# List < int > intList = new List< int > (); intList.Add(20); intList.Add(30); intList.Add(50); intList.Add(70); VB.Net Dim intList As New List(Of Integer)() intList.Add(20) intList.Add(30) intList.Add(50) intList.Add(70)

Add String values in the List

C# months.Add("January"); months.Add("Frebruary"); months.Add("March"); months.Add("April"); months.Add("May"); months.Add("June"); VB.Net months.Add("January") months.Add("Frebruary") months.Add("March") months.Add("April") months.Add("May") months.Add("June")

Obtaining the number of elements in a List ?

You can use "count" property to know the number of items in the List collection

Retrieve items from List ?

You can retrieve items from List collection by using for loops.

foreach loop

C# foreach (string month in months) { MessageBox.Show(month); } VB.Net For Each month As String In months MessageBox.Show(month) Next

for loop

C# for (int i = 0; i < months.Count; i++) { MessageBox.Show(months[i]); } VB.Net For i As Integer = 0 To months.Count - 1 MessageBox.Show(months(i)) Next

Insert an item in the List ?

You can insert an item in the List by specify its index value like (index,item) .

In the above code the month "March" inserted in the index position 2.

Remove an item from List collection ?

Remove() can use to remove item from List collection.

months.Remove("March");

Check if an item contains in the List collection ?

You can use List.Contains() methods to check an item exists in the List

C# if (months.Contains("March")) { MessageBox.Show("The month March exists in the List"); } VB.Net If months.Contains("March") Then MessageBox.Show("The month March exists in the List") End If

Copy an Array to a List collection ?

C# string strArr = new string; strArr = "Sunday"; strArr = "Monday"; strArr = "Tuesday"; //here to copy array to List List < string > arrlist = new List < string > (strArr); VB.Net Dim strArr As String() = New String(2) {} strArr(0) = "Sunday" strArr(1) = "Monday" strArr(2) = "Tuesday" "here to copy array to List Dim arrlist As New List(Of String)(strArr)

Finally clear method remove all the items from List collection.

The following program shows some operations in List collections.

Комментарии: 0

Иногда работа c выпадающими списками вызывает некоторые затруднения. Рассмотрим пример, в котором нам нужно создать страницу редактирования музыкального трека. Каждая композиция содержится в каком либо альбоме, имеет название и номер. Это можно изобразить в следующем коде:

@Html.DropDownList("AlbumId", Model.Albums) ... @Html.TextBox("Title", Model.Title) ... @Html.TextBox("TrackNumber", Model.TrackNumber)

Вспомогательный метод Html.DropDownList работает с объектами SelectListItem. Модель представления можно представить так:

Public class EditSongViewModel { public string Title { get; set; } public int TrackNumber { get; set; } public IEnumerable Albums { get; set; } }

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

Создание коллекции объектов SelectListItem

Существует несколько способов для создания последовательностей объектов SelectListItem. Наиболее подходящим может быть создание метода расширения для последовательности (в нашем случае – объекты Album), в котором коллекция сущностей конвертируется в коллекцию объектов SelectListItem.

Public static IEnumerable ToSelectListItems(this IEnumerable albums, int selectedId) { return albums.OrderBy(album => album.Name) .Select(album => new SelectListItem { Selected = (album.ID == selectedId), Text = album.Name, Value = album.ID.ToString() }); }

Этот метод можно использользовать так:

Model.Albums = _repository.FindAllAlbums().ToSelectItems(selectedId);

Этот код работает, потому что Html.DropDownList принимает в качестве входного параметра IEnumerable .

Можно использовать класс SelectList, но применять его нужно аккуратно. Например, если в SelectList не указать параметры DataTextField и DataValueField, то выпадающий список не будет работать корректно.

// неправильное использование model.Albums = new SelectList(_repository.FindAllAlbums().ToSelectListItems(1));

Выпадающий список отобразит “System.Web.Mvc.SelectListItem” вместо текстового имени каждого элемента.

Класс SelectList разработан для преобразования элементов, с той же целью, что и наш метод расширения выше (для преобразования элементов в коллекцию SelectListItem), но тут используется позднее связывание. Следующий код будет работать, так как мы указали поля описаний и значений для елементов списка.

// правильное использование model.Albums = new SelectList(_repository.FindAllAlbums(), "ID", "Name");

Получение выбранного значения

Если для принятия данных формы страницы используется та же сама модель представления, то можно предположить, что стандартный привязчик значений ASP.NET MVC проинициализирует снова коллекцию альбомов и укажет выбранный. Но, к сожалению, это не так - коллекция альбомов будет пустой.

Серверу страница вышлет только идентификатор выбранного альбома. Если нужно получить это значение в модели, то необходимо добавить свойство AlbumID.

Public class EditSongViewModel { public int AlbumId { get; set; } public string Title { get; set; } public int TrackNumber { get; set; } public IEnumerable Albums { get; set; } } И дополнительно код в представлении можно изменить так: @Html.DropDownListFor(x => x.AlbumId, Model.Albums) ... @Html.TextBoxFor(x => x.Title) ... @Html.TextBoxFor(x => x.TrackNumber)

Итак, резюмируем главные моменты вышеизложенного:

  • Не используйте SelectList без указания свойств DataTextField и DataValueField.
  • Не ожидайте увидеть коллекцию для выпадающего списка заполненной при обратном ответе.
  • Методы расширения помогают создавать последовательности объектов SelectListItem в строго типизированном коде.
  • Html.DropDownList не обязательно требует SelectList – подойдет любая коллекция объектов SelectListItem.

Динамические выпадающие списки (DropDownList) позволяют пользователю выбрать элемент из первого выпадающего списка, который заполняет второй выпадающий список на основе выбора в первом. В этой статье мы намерены продемонстрировать, как реализовать динамические выпадающие списки с использованием фреймворка ASP.NET MVC 3.

Создание модели представления:

Первым шагом является создание модели представления (ViewModel), которая представляет элементы для представления. Наша модель представления "вращается" вокруг отношений между категориями и продуктами. Пользователь будет выбирать категорию из выпадащего списка, который заполнит все соответствующие продукты в другом выпадающем списке.Реализация ниже показывает модель ArticleEditViewModel:

Using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcApplication1.ViewModels { public class ArticleEditViewModel { private List _categories = new List(); private List _products = new List(); public string SelectedCategory { get; set; } public string SelectedProduct { get; set; } public List Products { get { return _products; } } public List Categories { get { _categories.Add(new SelectListItem(){ Text = "Ruby", Value = "1"}); _categories.Add(new SelectListItem(){ Text = "JavaScript",Value="2"}); return _categories; } } } }

Заполнение выпадающего списка категорий:

Действие (action) Index контроллера HomeController возвращает новую модель ArticleEditViewModel для представления. Представление использует свойство Categories модели ArticleEditViewModel для заполнения выпадающего списка. Действие Index приведено ниже:

Public ActionResult Index() { return View(new ArticleEditViewModel()); }

Выпадающий список заполняется кодом, представленным ниже:

Select a category: @Html.DropDownListFor(x => x.SelectedCategory, new SelectList(Model.Categories,"Value","Text"),"Please Select a category") @Html.ValidationMessageFor(x => x.SelectedCategory)

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

Проверка срабатывает из-за того, что опция по умолчанию "Select a category" ("выберите категорию") не имеет никакого значения, связанного с ней. ASP.NET MVC пытается связать пустую строку со свойством SelectedCategory, но не может, так как SelectedCategory отмечен атриюутом .

Получение списка продуктов и заполнение зависимого выпадающего списка:

Нашей следующей задачей является получение выбранной категории, а затем и получение списка связанных продуктов с использованием categoryId. Это будет осуществляться Ajax-вызовом с помощью нашей любимой библиотеки JQuery. Реализация ниже показывает детали.

$(document).ready(function () { $("#SelectedCategory").change(function () { $.get("/Home/GetProductsForCategory/" + $(this).val(), function (response) { var products = $.evalJSON(response); var ddlSelectedProduct = $("#SelectedProduct"); // clear all previous options $("#SelectedProduct > option").remove(); // populate the products for (i = 0; i < products.length; i++) { ddlSelectedProduct.append($("").val(products[i].Value).text(products[i].Text)); } }); }); });

Код выше вызывает действие GetProductsForCategory с categoryId в качестве входного параметра. GetProductsForCategory возвращает ответ в формате JSON, который представляет список продуктов. Перед заполнением выпадающего списка продуктами, мы очищаем выпадающий список, удаляя все существующие элементы. Действие GetProductsForCategory осуществляется следующим образом:

Public string GetProductsForCategory(string id) { // get the products from the repository var products = new List(); if (id == "1") { products.Add(new SelectListItem() {Text = "Introduction to Ruby", Value = "1"}); products.Add(new SelectListItem() {Text = "Ruby Unit Testing", Value = "2"}); } else if(id == "2") { products.Add(new SelectListItem(){ Text = "JavaScript testing",Value = "1"}); products.Add(new SelectListItem() { Text = "JavaScript Ninja", Value = "2"}); } return new JavaScriptSerializer().Serialize(products); }

Действие выше просто возвращает жестко закодированные значения, но в реальном приложении вы будет получать продукты из системы хранения данных.

Скриншот ниже показывает конечный результат:

Вывод:

В этой статье мы научились создавать динамический выпадающий список в ASP.NET MVC. В будующем мы покажем, как упростить этот подход, создав HtmlHelper для динамических выпадающий списков.

Осознание опасности каждого часа жизни

дает чуткость и знание бесповоротности.

Афоризмы о жизни

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

Лишь женщина может сказать своё окончательное и бесповоротное «Может быть».

В России бесповоротно запретили сквернословие, муж с моей мамой окончательно перестал разговаривать.

Я бесповоротно и окончательно разочаровался в жизни. Верить нельзя ничему. Открыл дверь, на которой была надпись «Женщины», а там оказался туалет!

Бесповоротность – это когда решительно сжигаются все мосты. «Сжечь мосты» — это выражение пришло к нам от Юлия Цезаря, сказавшего: «Все мосты сожжены, Рубикон должен быть перейдён». При военных действиях мосты сжигали в двух случаях: - чтобы не было соблазна отступить; - чтобы можно было уйти от преследования врага, задержать его перед этим мостом. Позже это выражение перешло и в мирную речь. Но смысл остался похожий – совершить поступок, который не позволит вернуться к прошлому, то есть сделать что-то бесповоротное. Это поступок, точка невозврата которого, пройдена. Когда Юлий Цезарь из Галлии переправился через Ла-Манш и высадился со своими легионами в стране, которая теперь называется Англией, он приказал своим солдатам остановиться на меловых утесах Дувра; взглянув вниз с высоты двухсот футов над морем, они увидели красные языки пламени, пожирающие все корабли, на которых они прибыли. Они находились во вражеской стране, последняя связь с континентом исчезла, последнее средство отступления было сожжено, и им оставалось только одно: наступать и побеждать. И они победили.

Чеховская Нина в «Чайке» говорит: «Я решила бесповоротно, жребий брошен, я поступаю на сцену». Словом, бесповоротность предполагает, что произнесенное слово последнее, окончательное и решительное.

Женщина в интернете в контексте бесповоротности делает правильный и мудрый вывод: «Просто я окончательно и бесповоротно убедилась, что у любви нет фиксированного времени прибытия. Не надо стоять на перроне, пытаясь влезть в любой подъехавший состав. Следуйте расписанию своего сердца…» Лучше отказать решительно и бесповоротно, чем спешить и стесняться отказа. Сейчас девушки порой настолько стыдливы, что стыдятся бесповоротно отказывать мужчинам.

Бесповоротность в благости – дочь решительности и непреклонности. Вершиной бесповоротности принятого решения, на мой взгляд, является Белорусская операция во время Великой Отечественной войны. “Мой Багратион” — так Сталин называл Рокоссовского. Пятый “Сталинский удар” Рокоссовский предложил провести с двух плацдармов, а в Ставке настаивали на одном, в том числе Сталин, Жуков и другие.

Спорить со Сталиным – опасное занятие, но когда принято бесповоротное решение, опасения и страхи уходят на задний план. Рокоссовский докладывал: – Я предлагаю прорывать оборону противника двумя ударными группировками, действующими по сходящимся направлениям: с северо-востока – на Бобруйск, Осиповичи и с юга – на Осиповичи.

Такое решение вызвало вопрос Сталина: – Почему вы распыляете силы фронта? Не лучше ли объединить их в один мощный кулак, протаранить этим кулаком оборону противника? Прорывать оборону нужно в одном месте. – Если мы будем прорывать оборону на двух участках, товарищ Сталин, мы достигнем существенных преимуществ. – Каких же? – Во-первых, нанося удар на двух участках, мы сразу вводим в дело большие силы, далее, мы лишаем противника возможности маневрировать резервами, которых у него и так немного. И, наконец, если мы достигнем успеха хотя бы на одном участке, это поставит врага в тяжелое положение. Войскам же фронта будет обеспечен успех. – Мне кажется, – настаивал Сталин, – что удар надо наносить один, и с плацдарма на Днепре, на участке 3-й армии. Вот что, пойдите, подумайте часа два, а потом доложите Ставке свои соображения.

Рокоссовского отвели в небольшую комнату по соседству с кабинетом. Эти два часа показались Константину Константиновичу вечностью. Он еще и еще раз проверил все расчеты, подготовленные штабом фронта. Сомнений не было – нужно наносить два удара. Входя в кабинет Сталина, Константин Константинович сохранял спокойствие, как и всегда.

– Вы продумали решение, товарищ Рокоссовский? – Так точно, товарищ Сталин. – Так что же, будем наносить один удар или два удара? – Иосиф Виссарионович прищурился. В кабинете было тихо.

– Я считаю, товарищ Сталин, что два удара наносить целесообразней. – Значит, вы не изменили своего мнения? – Да, я настаиваю на осуществлении моего решения. – Почему вас не устраивает удар с плацдарма за Днепром? Вы же распыляете силы! – Распыление сил произойдет, товарищ Сталин, я с этим согласен. Но на это надо пойти, учитывая местность Белоруссии, болота и леса, а также расположение вражеских войск. Что же касается плацдарма 3-й армии за Днепром, то оперативная емкость этого направления мала, местность там крайне тяжелая и с севера нависает сильная вражеская группировка, что нельзя не учитывать. – Идите, подумайте еще, – приказал Сталин. – Мне кажется, что вы напрасно упрямитесь.

Вновь Рокоссовский один, вновь он продумывает одно за другим все «за» и «против» и вновь укрепляется во мнении: его решение правильное и БЕСПОВОРОТНОЕ. Когда его снова пригласили в кабинет, он постарался, как можно убедительнее изложить свои доводы в пользу нанесения двух ударов. Рокоссовский закончил говорить, и наступила пауза. Сталин за столом молча раскуривал трубку, затем поднялся, подошел к Константину Константиновичу: – Настойчивость командующего фронтом доказывает, что организация наступления тщательно продумана. А это гарантия успеха. Ваше решение утверждается, товарищ Рокоссовский.