0

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

автогенерируемая модель у меня выглядит так

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 result; 
     } 
     // 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> 
+0

Используйте свой dbContext в методе 'GetSelectListItems', а не' element' – mmcrae

ответ

0

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

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

объекты данных Access

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(); 

UPDATE !!!!

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

Надеюсь, что это поможет. Cheers :)

+0

, если возникнут вопросы, попросите прочь. – JJohnson

+0

см. Мое обновление. Спасибо за вашу помощь. –

+0

Ознакомьтесь с обновлениями, которые я разместил. – JJohnson

0

Я использую структуру сущности
частный EmployeeContext db = new EmployeeContext(); У меня есть таблица с именем Титулы

Вот мой новый 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, поэтому не знаю, как это исправить. Кажется, что это должна быть простая задача. Я пытаюсь привязать данные из таблицы титров к выпаданию, а затем, когда выбран заголовок. Я хочу, чтобы соответствующие вопросы из базы данных отображались.

Смежные вопросы