另一个模型的ASP.NET MVC 5 DropDownList

时间:2017-05-06 14:18:50

标签: c# asp.net-mvc-5 entity-framework-6

我刚刚开始使用MVC。我正在使用实体框架在asp.net mcv 5中构建项目。我已经研究了许多线程,但我没有找到任何有助于解决我的问题的东西。我有两种型号:
资源:

public class Resource
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        public string Comments { get; set; }

        [Required]
        public ResourceType Type { get; set; }

        public bool IsActive { get; set; }
    }

的ResourceType:

public class ResourceType
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }
    }

问题是:在视图中>资源>创建我想为对象 ResourceType Type 添加DropDownList,其值来自类ResourceType string Name
Create.cshtml

@model NetAudit.Models.Resource

@{
    ViewBag.Title = "Create Resource";
}

<h2>Create</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Resource</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Comments, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Comments, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Comments, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Type, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                HERE
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.IsActive, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.IsActive)
                    @Html.ValidationMessageFor(model => model.IsActive, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Dodaj" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to list", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

RecourceType控制器:

using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;
using NetAudit.Models;

namespace NetAudit.Controllers
{
    public class ResourceTypesController : BaseController
    {
        private readonly ApplicationDbContext _db = new ApplicationDbContext();

        [Authorize]
        public ActionResult Index()
        {
            return View(_db.ResourceTypes.ToList());
        }
        [Authorize]
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            return View(resourceType);
        }
        [Authorize]
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult Create(ResourceType resourceType)
        {
            if (ModelState.IsValid)
            {
                _db.ResourceTypes.Add(resourceType);
                _db.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(resourceType);
        }
        [Authorize]
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            return View(resourceType);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult Edit(ResourceType resourceType)
        {
            if (ModelState.IsValid)
            {
                _db.Entry(resourceType).State = EntityState.Modified;
                _db.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(resourceType);
        }
        [Authorize]
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            return View(resourceType);
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]

        public ActionResult DeleteConfirmed(int id)
        {
            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            _db.ResourceTypes.Remove(resourceType);
            _db.SaveChanges();

            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _db.Dispose();
            }

            base.Dispose(disposing);
        }
    }
}

资源控制器:

using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web.Mvc;
using NetAudit.Models;

namespace NetAudit.Controllers
{
    public class ResourceTypesController : BaseController
    {
        private readonly ApplicationDbContext _db = new ApplicationDbContext();

        [Authorize]
        public ActionResult Index()
        {
            return View(_db.ResourceTypes.ToList());
        }
        [Authorize]
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            return View(resourceType);
        }
        [Authorize]
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult Create(ResourceType resourceType)
        {
            if (ModelState.IsValid)
            {
                _db.ResourceTypes.Add(resourceType);
                _db.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(resourceType);
        }
        [Authorize]
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            return View(resourceType);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]

        public ActionResult Edit(ResourceType resourceType)
        {
            if (ModelState.IsValid)
            {
                _db.Entry(resourceType).State = EntityState.Modified;
                _db.SaveChanges();

                return RedirectToAction("Index");
            }

            return View(resourceType);
        }
        [Authorize]
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            return View(resourceType);
        }

        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]

        public ActionResult DeleteConfirmed(int id)
        {
            var resourceType = _db.ResourceTypes.Find(id);

            if (resourceType == null)
            {
                return HttpNotFound();
            }

            _db.ResourceTypes.Remove(resourceType);
            _db.SaveChanges();

            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                _db.Dispose();
            }

            base.Dispose(disposing);
        }
    }
}

我花了很多时间寻找这个问题的解决方案。非常感谢您对此的反馈。

1 个答案:

答案 0 :(得分:0)

首先将资源控制器置于此处(资源和资源类型均为ResourceType)。先修复它。

在此代码中输入 Here 部分,以从 ViewBag.Types 呈现select元素:

@Html.DropDownListFor(m => m.Type.Id, (SelectList)ViewBag.Types, new
                           {
                               @class = "form-control"
                           });

在此之前,您必须在操作中填写 ViewBag.Types ,将 ResourceController 的第一个创建操作更改为:

        [Authorize]
        public ActionResult Create()
        {
            ViewBag.Types = new SelectList(_db.ResourceTypes.ToList(), "Id", "Name", "0");
            return View();
        }

它会奏效。