【发布时间】:2012-04-26 15:26:50
【问题描述】:
我一直在关注位于here 的 Microsoft Contoso MVC3 大学教程
我有一个关于一个领域的问题,在第 6 部分;本教程解释了如何使用复选框创建可以分配给讲师的课程表。特别是从标题“将课程作业添加到讲师编辑页面”开始
似乎过于复杂,有没有更有效的做事方式?插件/内置系统等 如果您想扩展系统以使讲师拥有的不仅仅是分配给他的课程,该怎么办?代码的重复将是巨大的。
教师控制器
// GET: /Instructor/Edit/5
public ActionResult Edit(int id)
{
Instructor instructor = db.Instructors
.Include(i => i.OfficeAssignment)
.Include(i => i.Courses)
.Where(i => i.InstructorID == id)
.Single();
PopulateAssignedCourseData(instructor);
return View(instructor);
}
private void UpdateInstructorCourses(string[] selectedCourses, Instructor instructorToUpdate)
{
if (selectedCourses == null)
{
instructorToUpdate.Courses = new List<Course>();
return;
}
var selectedCoursesHS = new HashSet<string>(selectedCourses);
var instructorCourses = new HashSet<int>
(instructorToUpdate.Courses.Select(c => c.CourseID));
foreach (var course in db.Courses)
{
if (selectedCoursesHS.Contains(course.CourseID.ToString()))
{
if (!instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.Courses.Add(course);
}
}
else
{
if (instructorCourses.Contains(course.CourseID))
{
instructorToUpdate.Courses.Remove(course);
}
}
}
}
private void PopulateAssignedCourseData(Instructor instructor)
{
var allCourses = db.Courses;
var instructorCourses = new HashSet<int>(instructor.Courses.Select(c => c.CourseID));
var viewModel = new List<AssignedCourseData>();
foreach (var course in allCourses)
{
viewModel.Add(new AssignedCourseData
{
CourseID = course.CourseID,
Title = course.Title,
Assigned = instructorCourses.Contains(course.CourseID)
});
}
ViewBag.Courses = viewModel;
}
edit.cshtml
int cnt = 0;
List<UniversitySystem.ViewModels.AssignedCourseData> courses = ViewBag.Courses;
foreach (var course in courses)
{
if (cnt++ % 3 == 0)
{
@: </tr> <tr>
}
@: <td>
<input type="checkbox"
name="selectedCourses"
value="@course.CourseID"
@(Html.Raw(course.Assigned ? "checked=\"checked\"" : "")) />
@course.CourseID @: @course.Title
@:</td>
}
@: </tr>
}
</table>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
ViewModels/AssignedCourseData.cs
public class AssignedCourseData
{
public int CourseID { get; set; }
public string Title { get; set; }
public bool Assigned { get; set; }
}
}
大量代码可有效创建此屏幕:
我想你可以概括 InstructorController 中使用的辅助方法,但这不是一项小任务。
处理一对多关系似乎是 CRUD 系统的基本组成部分;我很惊讶我找不到有关该主题的信息。
TLDR:有没有比上面显示的更好的方法来使用 MVC3/Entity 框架将对象与其他对象关联起来。
编辑2: 这是快速 Lightswitch 应用程序的图像 候选人可以有许多与其相关的技能、残疾和违规行为。如果我要实现这个系统的 MVC 版本,我会 x3 上面列出的代码来创建相同的效果。
肯定有更有效的解决方案。
【问题讨论】:
-
“过度复杂”是主观的。这是一个很大的教程。为什么不将代码的相关部分与问题一起发布?
-
您觉得这方面的具体是什么过于复杂。只是发布代码,而不将其本地化到哪个特定代码并不能帮助我们理解您的问题。您发布的代码实际上非常简洁,因为它所做的一切。
-
那是因为它是一个电灯开关应用程序。 MVC 是一个更“低级”的框架,可以让您对事物进行更多的控制。更多的控制权是以不得不为自己做更多事情为代价的。 Lightswitch 通过降低您的灵活性来完成它的工作。 MVC 是关于控制流程的每一个细节,同时仍然帮助您尽可能提高工作效率。 Lightswitch 基本上就像 Access 中的表单设计器,没有 Access 要求。你可以用它做很多事情,但你有很多限制。
-
我还应该指出,如果您想创建一个与 Lightswitch 中的 MVC 应用程序看起来 IDENTICAL 的表单,需要多少代码?我说的不是功能相似的,我指的是相同的。您会花费大量时间来做 MVC 中极其简单的事情。一切都是为了权衡。
标签: c# .net asp.net-mvc-3 entity-framework