MVC 4.6 Привязка выпадающего списка из DbContext

#c# #asp.net-mvc #entity-framework #asp.net-mvc-4 #data-binding

#c# #asp.net-mvc #entity-framework #asp.net-mvc-4 #привязка данных

Вопрос:

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

Автоматически сгенерированная модель, которая у меня есть, выглядит следующим образом

 namespace Demo1.Models{
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;

public partial class Title
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Title()
    {
        TitlesQuestions = new HashSet<TitlesQuestion>();
    }

    public int TitleId { get; set; }

    [Column("Title")]
    [Required]
    [StringLength(20)]
    public string Title1 { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<TitlesQuestion> TitlesQuestions { get; set; }
    public SelectList TitleList { get; set; }

}
  

Моя ViewModel

 using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace Demo1.ViewModels.Titles
{
    public class TitlesViewModel
    {
        public int TitleId { get; set; }

        [Required]
        [Display(Name = "Title")]
        public string Title { get; set; }
        public IEnumerable<SelectListItem> Titles { get; set; }
    }
}
  

Мой контроллер

 using Demo1.Models;
using Demo1.ViewModels.Titles;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace Demo1.Controllers
{
    public class TitlesController : Controller
    {
        private EmployeeContext db = new EmployeeContext();
        public IEnumerable<Title> GetTitleList()
        {
            var result = db.Titles.ToList();

            return resu<
        }
        // GET: Titles
        public ActionResult Index()
        {
            var titles = GetAllTitles();
            var model = new TitlesViewModel();
            model.Titles = GetSelectListItems(titles);

            return View(model);
        }

        private IEnumerable<string> GetAllTitles()
        {
            return new List<string>
            {
                "CEO",
                "Project Manager",
                "Technical Lead",
                "Software Developer",
            };
        }

        private IEnumerable<SelectListItem> GetSelectListItems(IEnumerable<string> elements)
        {
            var selectList = new List<SelectListItem>();
            foreach (var element in elements)
            {
                selectList.Add(new SelectListItem
                {
                    Value = element,
                    Text = element
                });
            }

            return selectList;
        }
    }
}
  

Мое мнение

 @model Demo1.ViewModels.Titles.TitlesViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Questions by Title Demo</h2>
<form asp-controller="Titles" asp-action="Index" method="post" class="form-horizontal" role="form">

    <label asp-for="Title" class="col-md-2 control-label"></label>
    <div>
        @Html.DropDownListFor(m => m.Title, // 1. Store selected value in Model.Roles when page is rendered after postback,take selected value from Model.State.
            Model.Titles, // 2. Take list of values from Model.Titles
            "- Please select your title -", // 3. Text for the first 'default' option
            new { @class = "form-control" }) @*// 4. A class name to assign to <select> tag*@
    </div>
</form>
  

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

1. Используйте свой DbContext в вашем GetSelectListItems методе вместо elements

Ответ №1:

Я использую entity framework
private EmployeeContext db = new EmployeeContext(); У меня есть таблица с именем Titles

Вот мой новый ActionResult Index()

     public ActionResult Index()
    {
        var model = new TitlesViewModel();
        var titles = GetSelectListItems();
        model.Titles = titles;

        return View(model);
    }

    public IEnumerable<SelectListItem> GetSelectListItems()
    {
        foreach (var title in db.Titles)
        {
            yield return new SelectListItem
            {
                Value = title.TitleId.ToString(),
                Text = title.Title1
            };
        }
    }
  

Когда я пытаюсь запустить свой проект, я получаю следующую ошибку
Класс ‘System.Web.Mvc.SelectList’ не имеет конструктора без параметров. Я новичок в mvc, поэтому я не уверен, как это исправить. Кажется, что это должна быть простая задача, я пытаюсь привязать данные из таблицы titles к выпадающему списку, а затем, как только заголовок выбран, я хочу, чтобы отображались соответствующие вопросы из базы данных.

Ответ №2:

Я думаю, что это скорее вопрос, связанный с тем, как запрашивать базу данных. В целом для этого вопроса требуется немного больше контекста (какая база данных используется). В зависимости от того, что вы используете, есть много способов запросить базу данных. Мой любимый для SQL — это использованиеADO.NET Модель данных объекта. Это подход, ориентированный на базу данных. Он создает файл .edmx, который создает все модели из таблиц, выбранных вами при его настройке.

После установки:

Доступ к объектам данных

 MyAccountEntities users = new MyAccountEntities();
  

Доступ к таблицам (используйте LINQ для изменения DbSet<UserAccount> на List<UserAccount> ) 😉

 users.UserAccounts.ToList();
  

Используйте LINQ для запроса вашей таблицы / списка. (возвращает список пользователей с именем bob)

 string username = "bob";
users.UserAccounts.Where(u => u.username == username).ToList();
  

ОБНОВЛЕНИЕ!!!!

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

Надеюсь, это поможет. Приветствия 🙂

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

1. если есть какие-либо вопросы, задавайте сразу.