私はここにあるMicrosoftContosoMVC3大学のチュートリアルに従っています
ある分野について質問があります。パート6。チュートリアルでは、チェックボックスを使用してインストラクターを割り当てることができるコースのテーブルを作成する方法について説明します。具体的には、「インストラクター編集ページへのコース割り当ての追加」の見出し以降
複雑すぎるようですが、もっと効率的な方法はありますか?プラグイン/ビルトインシステムなど。システムを拡張して、インストラクターにコースだけでなくそれ以上のものを割り当てたい場合はどうすればよいでしょうか。コードの重複は膨大なものになります。
InstructorController
// 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で使用されるヘルパーメソッドを一般化できると思いますが、それは簡単な作業ではありません。
1つ/多対多の関係を処理することはCRUDシステムのそのような基本的なコンポーネントのようです。そのトピックに関する情報が見つからないことに驚いています。
TLDR:MVC3 / Entity Frameworkを使用して、オブジェクトを他のオブジェクトに関連付けるためのより良い方法は、上に示したものよりも優れていますか?
Edit2:これは簡単なLightswitchアプリケーションの画像です
。候補者は、それらに関連するいくつかのスキル、障害、および犯罪を持つことができます。このシステムのMVCバージョンを実装する場合、同じ効果を作成するために上記のコードを3倍にします。
確かに、より効率的な解決策があります。