MVC 4.6绑定dbContext的下拉列表

时间:2016-10-18 19:38:50

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

我有一个mvc空项目,我试图根据用户从标题下拉菜单中选择的内容从数据库中提取问题(下拉列表的值也来自数据库)。
到目前为止,我有使用硬编码值的下拉列表。如何从数据库中提取标题,如何提取与所选标题相关的问题。

我自动生成的模型看起来像这样

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>

2 个答案:

答案 0 :(得分:0)

我认为这更像是一个涉及如何查询数据库的问题。总的来说,这个问题需要更多的上下文(正在使用什么数据库)。根据您使用的内容,有许多方法可以查询数据库。我最喜欢的SQL是使用ADO.NET Entity Data Model。这是数据库的第一种方法。它会创建一个.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();

UPDATE !!!!

感谢您缩小问题范围。问题非常简单。您没有构造函数来获取SelectListItem模型的参数。转到定义模型的位置,然后使用您希望传递它的参数创建构造函数。

希望这有助于。干杯:)

答案 1 :(得分:0)

我使用实体框架
    private EmployeeContext db = new EmployeeContext(); 我有一个名为Titles的表

这是我的新ActionResult索引()

    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
            };
        }
    }

当我尝试运行我的项目时,我收到以下错误 该类&#39; System.Web.Mvc.SelectList&#39;没有无参数构造函数。我是mvc的新手,所以我不确定如何修复它。这似乎应该是一个简单的任务我尝试将数据从titles表绑定到下拉菜单然后选择一个标题后我想要显示数据库中的相关问题。