未填充MVC 6 EF 7属性的列表框 [英] Listbox for MVC 6 EF 7 Property not Populating

查看:66
本文介绍了未填充MVC 6 EF 7属性的列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经尝试了一段时间,以填充一个列表框,但似乎无法弄清楚.我已经对实体框架7文档进行了广泛的研究,但我仍然是新手.关于MVC6/EF7的教程并不多,因此很难知道将一个实体类与另一个实体类相关联的最佳实践是什么.请原谅问题的长度,我只是想更加详尽.

I've been trying for a while now to get a list box to populate and I can't seem to figure it out. I've studied entity framework 7 documentation pretty extensively but I'm still new to it. There aren't a lot of tutorials out there for MVC6/EF7 yet so its been hard to know what the best practice is for associating one entity class with an instance of another. Please excuse the length of the question, I'm just trying to be thorough.

我正在使用实体框架7,asp.net 5和MVC6.

I'm using entity framework 7, asp.net 5 and MVC 6.

  1. 创建一个新的 ASP.Net Web应用程序→项目名称: ListBox.Web →解决方案名称​​ ListBox
  2. 选择 APS.NET 5模板 Web应用程序
  3. Models 文件夹中创建两个类

  1. Create a new ASP.Net Web Application → Name of project: ListBox.Web → Name of solution ListBox
  2. Choose APS.NET 5 TemplatesWeb Application
  3. Create two classes in the Models folder

Parent.cs

Parent.cs

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

namespace ListBox.Web.Models
{
    public class Parent
    {
        public int ParentId { get; set; }
        [Required]
        public string Name { get; set; }
        public ICollection<Child> Children { get; set; }
    }
}

Child.cs

using System.ComponentModel.DataAnnotations;

namespace ListBox.Web.Models
{
    public class Child
    {
        public int ChildId { get; set; }
        [Required]
        public string Name { get; set; }
        public int ParentId { get; set; }
        public Parent Parent { get; set; }
    }
}

  • 使用脚手架为每个数据类创建控制器和视图

  • Create controllers and views for each of the data classes using scaffolding

    _Layout.cshtml

                <ul class="nav navbar-nav">
                    <li><a asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-controller="Parents" asp-action="Index">Parents</a></li>
                    <li><a asp-controller="Children" asp-action="Index">Children</a></li>
                    <li><a asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
    

  • 创建数据库

  • Create the database

    ListBox\src\ListBox.Web>dns ef migrations add Initial
    ListBox\src\ListBox.Web>dnx ef database update     
    

  • 运行Web应用程序

  • Run the web application

    添加一对父母.

    试图添加一个孩子.

    • 为父母显示了一个下拉框,但下拉框中没有可供选择的项目
    • 列表框的HTML是:<select class="form-control" data-val="true" data-val-required="The ParentId field is required." id="ParentId" name="ParentId"></select>

    控制器源代码

    using System.Linq;
    using Microsoft.AspNet.Mvc;
    using Microsoft.AspNet.Mvc.Rendering;
    using Microsoft.Data.Entity;
    using ListBox.Web.Models;
    
    namespace ListBox.Web.Controllers
    {
        public class ChildrenController : Controller
        {
            private ApplicationDbContext _context;
    
            public ChildrenController(ApplicationDbContext context)
            {
                _context = context;    
            }
    
            // GET: Children
            public IActionResult Index()
            {
                var applicationDbContext = _context.Child.Include(c => c.Parent);
                return View(applicationDbContext.ToList());
            }
    
            // GET: Children/Details/5
            public IActionResult Details(int? id)
            {
                if (id == null)
                {
                    return HttpNotFound();
                }
    
                Child child = _context.Child.Single(m => m.ChildId == id);
                if (child == null)
                {
                    return HttpNotFound();
                }
    
                return View(child);
            }
    
            // GET: Children/Create
            public IActionResult Create()
            {
                ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent");
                return View();
            }
    
            // POST: Children/Create
            [HttpPost]
            [ValidateAntiForgeryToken]
            public IActionResult Create(Child child)
            {
                if (ModelState.IsValid)
                {
                    _context.Child.Add(child);
                    _context.SaveChanges();
                    return RedirectToAction("Index");
                }
                ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent", child.ParentId);
                return View(child);
            }
    
            // GET: Children/Edit/5
            public IActionResult Edit(int? id)
            {
                if (id == null)
                {
                    return HttpNotFound();
                }
    
                Child child = _context.Child.Single(m => m.ChildId == id);
                if (child == null)
                {
                    return HttpNotFound();
                }
                ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent", child.ParentId);
                return View(child);
            }
    
            // POST: Children/Edit/5
            [HttpPost]
            [ValidateAntiForgeryToken]
            public IActionResult Edit(Child child)
            {
                if (ModelState.IsValid)
                {
                    _context.Update(child);
                    _context.SaveChanges();
                    return RedirectToAction("Index");
                }
                ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent", child.ParentId);
                return View(child);
            }
    
            // GET: Children/Delete/5
            [ActionName("Delete")]
            public IActionResult Delete(int? id)
            {
                if (id == null)
                {
                    return HttpNotFound();
                }
    
                Child child = _context.Child.Single(m => m.ChildId == id);
                if (child == null)
                {
                    return HttpNotFound();
                }
    
                return View(child);
            }
    
            // POST: Children/Delete/5
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public IActionResult DeleteConfirmed(int id)
            {
                Child child = _context.Child.Single(m => m.ChildId == id);
                _context.Child.Remove(child);
                _context.SaveChanges();
                return RedirectToAction("Index");
            }
        }
    }
    

    子Create.cshtml

    @model ListBox.Web.Models.Child
    
    @{
        ViewData["Title"] = "Create";
    }
    
    <h2>Create</h2>
    
    <form asp-action="Create">
        <div class="form-horizontal">
            <h4>Child</h4>
            <hr />
            <div asp-validation-summary="ValidationSummary.ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="Name" class="form-control" />
                    <span asp-validation-for="Name" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <label asp-for="ParentId" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <select asp-for="ParentId" class ="form-control"></select>
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    </form>
    
    <div>
        <a asp-action="Index">Back to List</a>
    </div>
    
    @section Scripts {
        <script src="~/lib/jquery/dist/jquery.min.js"></script>
        <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
        <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
    }
    

    推荐答案

    更改ChildrenController中的Create()方法,更改

        public IActionResult Create()
        {
            ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Parent");
            return View();
        }
    

        public IActionResult Create()
        {
            ViewData["ParentId"] = new SelectList(_context.Set<Parent>(), "ParentId", "Name");
            return View();
        }
    

    Create.cshtml中,更改

    <select asp-for="ParentId" class="form-control"></select>
    

    @Html.DropDownList("ParentId", null, htmlAttributes: new { @class = "form-control" })
    

    这篇关于未填充MVC 6 EF 7属性的列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆