我正在使用C#,MVC3,EF5,SQL Server 2008 R2。
我有一个交叉表即
Lecturer -< LecturerCourse >- Course
填充了讲师名单。
当我添加一门课程时,我可以选择一个可以选择的讲师列表,教授相关课程。当我保存新的课程记录时,这个多选还应该通过模型绑定将其数据保存回“LecturerCourse”表。
我正在使用EF5。
你能推荐一种简单而标准的方法来解决连接的CRUD,即“LecturerCourse”,表吗?我在网上看过,但有些方法看起来很复杂。
非常感谢。
答案 0 :(得分:2)
好吧,这将是一个漫长的过程。要允许这种情况发生在“一页”中(通过POST,或者您可以在技术上使用Ajax),您需要结合方法的Get和Post版本并正确构建视图模型。以下是我将用于演示目的的类:
public class NewCourse
{
[Required]
public string Name { get; set; }
// And your other properties
public int[] LecturerIds { get; set; }
}
public class ViewLecturer
{
public int Id { get; set; }
public int Name { get; set; }
}
public class NewCourseViewModel
{
public NewCourse Course { get; set; }
public IEnumerable<ViewLecturer> Lecturers { get; set; }
}
NewCourseViewModel
将成为View的模型(见下文)。 ViewLecturer
会为您提供可用的Lecturer
与添加到其中所需信息之间的较轻的映射。
至于Controller
:
public class CourseController : Controller, IDisposable
{
private Lazy<YourContext> lazyContext =
new Lazy<YourContext>(() => new YourContext());
private YourContext Context
{
get { return lazyContext.Value; }
}
public ActionResult New()
{
var model = new NewCourseViewModel {
Course = new NewCourse(),
Lecturers = Context.Lecturers
.Select(l => new ViewLecturer { Id = l.Id, Name = l.Name })
};
return View(model);
}
[HttpPost]
public ActionResult New(NewCourse course)
{
if(ModelState.IsValid)
{
var lecturers = course.Lecturers
.Select(l => new Lecturer { Id = l.Id })
.ToList();
foreach(var lecturer in lecturers)
Context.Lecturers.Attach(lecturer);
var newCourse = new Course {
Name = course.Name,
// ... and the rest of the mapping
Lecturer = lecturers
};
context.Courses.Add(newCourse);
context.SaveChanges();
// Could have to handle DbUpdateException if you want
return RedirectToAction(...);
}
return View(new NewCourseViewModel {
Course = course,
Lecturers = Context.Lecturers
.Select(l => new ViewLecturer { Id = l.Id, Name = l.Name })
});
}
public void Dispose()
{
if(lazyContext.IsValueCreated)
lazyContext.Value.Dispose();
}
}
您的第一个New
方法会为您提供Course
创建页面的入口点。其余的验证和实际添加将通过[HttpPost]
重载完成。至于您的View
(应该在~/Views/Course/New.cshtml
中):
@model NewCourseViewModel
// ... Then when you are ready to begin the form
@using(Html.BeginForm("New", "Course", FormMethod.Post))
{
// Your List of Lecturers
@Html.ListBoxFor(m => m.Course.LecturerIds,
new MultiSelectList(
Model.Lecturers,
"Id",
"Name",
m.Course.LecturerIds ?? new int[0]
))
// Your Other Model binding
}
当按下提交按钮时,匹配的动作将是New(NewCourse course)
。由于HtmlHelper
生成ID的方式,名称很重要。因为我们只包含整个视图模型的一个属性,所以它将根据视图模型的course
属性匹配参数名Course
。您将获得讲师的Id
列表,您可以使用这些列表附加到DbContext
并直接添加到新的Course
模型(实体框架将完成剩下的工作) )。如果出现问题,我们可以取回讲师列表并在视图模型中重复使用相同的NewCourse
。
现在这个例子非常基础,但它应该为你如何构建视图模型提供一个很好的起点。