1

私はここにある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倍にします。

確かに、より効率的な解決策があります。

4

1 に答える 1

1

あなたのコメントに基づくと、MVCがLightswitchになることを探しているようです。もしそうなら、マイクロソフトはライトスイッチを開発していなかっただろう。

Microsoftは、MVC、Webページ(WebMatrix)、WebForms、LightSwitchなどの多くのテクノロジを提供しています。それぞれに独自の長所と短所があり、要件に最適なテクノロジーを選択します。

MVCで開発している場合は、プレゼンテーションコードの記述により多くの労力を費やす必要があります。ただし、この余分な作業により、プレゼンテーションの動作、外観、および動作に優れた柔軟性がもたらされます。それをしたくない場合は、別のテクノロジーを選択することをお勧めします。

于 2012-04-14T16:42:56.903 に答える