【发布时间】:2012-01-07 16:11:41
【问题描述】:
我对 MVC3 框架相当陌生,在为我的一个表编辑或创建数据时遇到了一些问题。我在此解决方案中使用了 EF 代码优先方法。
我有一个表,其中有 2 个字段链接回同一个表。例如: [entry] 表可以引用 2 个不同的学生。这是代码:
public class Entry
{
public int EntryID { get; set; }
public int DanceEventID { get; set; }
public int StudentID { get; set; }
public int? SecondaryStudentID { get; set; }
public int InstructorID { get; set; }
public int DanceID { get; set; }
public int DanceLevelID { get; set; }
public int StyleID { get; set; }
public int? EntryNumber { get; set; }
public virtual DanceEvent DanceEvent { get; set; }
public virtual Student Student { get; set; }
public virtual Student SecondaryStudent { get; set; }
public virtual Instructor Instructor { get; set; }
public virtual Dance Dance { get; set; }
public virtual DanceLevel DanceLevel { get; set; }
public virtual Style Style { get; set; }
}
public class Student
{
public int StudentID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int DanceLevelID { get; set; }
public virtual DanceLevel DanceLevel { get; set; }
public int StudioID { get; set; }
public virtual Studio Studio { get; set; }
public int GenderID { get; set; }
public virtual Gender Gender { get; set; }
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
}
我遇到的问题是,当我从视图中编辑或保存并输入 SecondaryStudent 时,这没有保存。该视图似乎只生成一个 Student 对象。
这是 MVC3 的限制,还是很可能我只是做错了什么。
编辑: 这是创建视图和控制器代码。
@model HeatBuilder.Models.Entry
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Entry</legend>
<div class="editor-label">
@Html.LabelFor(model => model.DanceEventID, "DanceEvent")
</div>
<div class="editor-field">
@Html.DropDownList("DanceEventID", String.Empty)
@Html.ValidationMessageFor(model => model.DanceEventID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StudentID, "Student")
</div>
<div class="editor-field">
@Html.DropDownList("StudentID", String.Empty)
@Html.ValidationMessageFor(model => model.StudentID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StudentID, "Second Student")
</div>
<div class="editor-field">
@Html.DropDownList("StudentID", String.Empty)
@Html.ValidationMessageFor(model => model.SecondaryStudentID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.InstructorID, "Instructor")
</div>
<div class="editor-field">
@Html.DropDownList("InstructorID", String.Empty)
@Html.ValidationMessageFor(model => model.InstructorID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DanceID, "Dance")
</div>
<div class="editor-field">
@Html.DropDownList("DanceID", String.Empty)
@Html.ValidationMessageFor(model => model.DanceID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.DanceLevelID, "DanceLevel")
</div>
<div class="editor-field">
@Html.DropDownList("DanceLevelID", String.Empty)
@Html.ValidationMessageFor(model => model.DanceLevelID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.StyleID, "Style")
</div>
<div class="editor-field">
@Html.DropDownList("StyleID", String.Empty)
@Html.ValidationMessageFor(model => model.StyleID)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using HeatBuilder.Models;
namespace HeatBuilder.Controllers
{
public class EntryController : Controller
{
private HeatBuilderContext db = new HeatBuilderContext();
//
// GET: /Entry/
public ViewResult Index()
{
var entries = db.Entries.Include(e => e.DanceEvent).Include(e => e.Student).Include(e => e.SecondaryStudent).Include(e => e.Instructor).Include(e => e.Dance).Include(e => e.DanceLevel).Include(e => e.Style);
return View(entries.ToList());
}
//
// GET: /Entry/Details/5
public ViewResult Details(int id)
{
Entry entry = db.Entries.Find(id);
return View(entry);
}
//
// GET: /Entry/Create
public ActionResult Create()
{
ViewBag.DanceEventId = new SelectList(db.DanceEvents, "DanceEventId", "EventName");
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName");
ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName");
ViewBag.InstructorId = new SelectList(db.Instructors, "InstructorID", "FullName");
ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName");
ViewBag.DanceLevelId = new SelectList(db.DanceLevels, "DanceLevelID", "Description");
ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription");
return View();
}
//
// POST: /Entry/Create
[HttpPost]
public ActionResult Create(Entry entry)
{
if (ModelState.IsValid)
{
db.Entries.Add(entry);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.DanceEventID = new SelectList(db.DanceEvents, "DanceEventId", "EventName", entry.DanceEventID);
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName", entry.StudentID);
ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName", entry.SecondaryStudentID);
ViewBag.InstructorID = new SelectList(db.Instructors, "InstructorID", "FullName", entry.InstructorID);
ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName", entry.DanceID);
ViewBag.DanceLevelID = new SelectList(db.DanceLevels, "DanceLevelID", "Description", entry.DanceLevelID);
ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription", entry.StyleID);
return View(entry);
}
//
// GET: /Entry/Edit/5
public ActionResult Edit(int id)
{
Entry entry = db.Entries.Find(id);
ViewBag.DanceEventID = new SelectList(db.DanceEvents, "DanceEventId", "EventName", entry.DanceEventID);
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName", entry.StudentID);
ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName", entry.SecondaryStudentID);
ViewBag.InstructorID = new SelectList(db.Instructors, "InstructorID", "FullName", entry.InstructorID);
ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName", entry.DanceID);
ViewBag.DanceLevelID = new SelectList(db.DanceLevels, "DanceLevelID", "Description", entry.DanceLevelID);
ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription", entry.StyleID);
return View(entry);
}
//
// POST: /Entry/Edit/5
[HttpPost]
public ActionResult Edit(Entry entry)
{
if (ModelState.IsValid)
{
db.Entry(entry).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.DanceEventID = new SelectList(db.DanceEvents, "DanceEventId", "EventName", entry.DanceEventID);
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FullName", entry.StudentID);
ViewBag.SecondaryStudentID = new SelectList(db.Students, "SecondaryStudentID", "FullName", entry.SecondaryStudentID);
ViewBag.InstructorID = new SelectList(db.Instructors, "InstructorID", "FullName", entry.InstructorID);
ViewBag.DanceID = new SelectList(db.Dances, "DanceId", "DanceName", entry.DanceID);
ViewBag.DanceLevelID = new SelectList(db.DanceLevels, "DanceLevelID", "Description", entry.DanceLevelID);
ViewBag.StyleID = new SelectList(db.Styles, "StyleID", "StyleDescription", entry.StyleID);
return View(entry);
}
//
// GET: /Entry/Delete/5
public ActionResult Delete(int id)
{
Entry entry = db.Entries.Find(id);
return View(entry);
}
//
// POST: /Entry/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
Entry entry = db.Entries.Find(id);
db.Entries.Remove(entry);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
谢谢。
【问题讨论】:
-
你混淆了一些技术。 MVC 与您的持久层无关。请向我们展示您在保存条目时使用的代码。
-
谢谢。我继续编辑原始帖子以包含控制器代码和创建视图/
标签: asp.net-mvc-3 entity-framework-4 entity-framework-4.1 ef-code-first