#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. если есть какие-либо вопросы, задавайте сразу.