DropDownList, Задать «value» для default option в MVC 4

в 16:54, , рубрики: .net, ASP, asp.net mvc 4, метки:

Здравствуйте. Больше двух лет создавал сайты на ПХП и все было прекрасно. Но в один прекрасный день проснулся и понял, что пхп — хорош, но не то. Потом рассматривал еще долго на чем лучше писать веб приложения, сравнивал, анализировал. В итоге остановился на C# и ASP.NET MVC 4. Даже после Zend Framework 2 — MVC 4 просто нечто: легко, красиво, просто, быстро, мало кода.

Но вот столкнулся с проблемой, решение которой в Гугле не нашел. Как вывести выпадающий список и задать значение по умолчанию. Думаю для «бывалых» — это будет не проблема. Это то, что один раз «проехать» и больше никогда не вспомнишь, что были проблемы с этим. но вот проехать для новичка бывает довольно затруднительно. Если честно, то поначалу было просто вывести выпадающий список тяжко. Хотя мануалы по ASP.NET MVC на порядок превосходят «Быстрый старт» для любого фреймворка пхп.

Сей мануал предполагает, что Вы уже оперируете знаниями, полученными при ознакомлении с этими статьями: Entity Framework в приложении ASP.NET MVC. Или этими: ASP.NET MVC 4 Tutorials

Начнем с вывода Выпадающего списка.
1) Модель. Аннотаций и связей нету для упрощения примера.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace zf2.Models
{
    public class NewsM
    {
        public int NewsMID { get; set; }
        public int ParentID { get; set; }
        public string Title { get; set; }
        public string AddTitle { get; set; }
        public string Description { get; set; }
        public string Content { get; set; }
        public DateTime ModDate { get; set; }
    }
}

2)Контроллер. Правой кнопкой на папке контроллер — создать контролер и выбираем Шаблон: «MVC-контроллер с действиями чтения, записи и представлениями, использующий Entity Framework», Класс модели «NewsM», Класс контекста данных: какой создали.

И добавляем в него метод:

         //Построение выпадающего списка
        private void PopulateDepartmentsDropDownList(object selectedDepartment = null)
        {
            var departmentsQuery = (from d in db.NewsMs
                                   orderby d.NewsMID
                                    select d).ToList<NewsM>();

            //Ну а собственно следущая строка и является модификацией этого метода, изначально описанного в примере Contoso University
            //NewsMID = 0 -  это и есть value
            //Title = "Add to root" - text
            departmentsQuery.Add(new NewsM { NewsMID = 0, Title = "Add to root" });

            ViewBag.ParentID = new SelectList(departmentsQuery, "NewsMID", "Title", selectedDepartment);
             //где departmentsQuery -  список, с котороко фреймворк сам построит DropDownList
             //"NewsMID" - строка с названием столбца из модели, данные строк которой заполнят значения value 
            //"Title" - строка с названием столбца из модели, данные строк которой заполнят значения text (Название, которое будет показываться в списке) 
            //selectedDepartment - значение selected. То что будет выбрано изначально.
        }

Дальше вызываем в экшенах Create и Edit:

        // GET: /News/Create

        public ActionResult Create()       
        {
            PopulateDepartmentsDropDownList();

            return View();
        }

        // GET: /News/Edit/5

        public ActionResult Edit(int id = 0)
        {
            NewsM newsm = db.NewsMs.Find(id);
            if (newsm == null)
            {
                return HttpNotFound();
            }
            //Тут передаем newsm.ParentID - для задания selected значения.
            PopulateDepartmentsDropDownList(newsm.ParentID);

            return View(newsm);
        }

3) Во вью. Просто добавляем в нужное место следующий код.
Create.cshtml и Edit.cshtml

        <div class="editor-label">
            @Html.LabelFor(model => model.ParentID)
        </div>
        <div class="editor-field">
            @Html.DropDownList("ParentID")
            <!--Тут "ParentID" должен совпадать с тем названием, что Вы прописали после точки в ViewBag.ParentID = new SelectList(...  метода PopulateDepartmentsDropDownList. И еще желательно, что б "ParentID" не совпадал с названиями моделей, контроллеров, экшенов и тд...-->
            @Html.ValidationMessageFor(model => model.ParentID) 
        </div>

Кстати описанная в начале модель — таблица для хранения и построения динамического меню любой вложенности. С ней был тоже отдельный случай. Расскажу в следующей статье.

Автор: struggleendlessly

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js