3

たとえば、私はモデルを持っています: StudentCourseStudentがありますList<Course> Courses{get;set;}

すべてのデータはすでにWebサービスから入力されています

私はStudent/IndexActionResultを返すビューを持っていますが、ActionResultを返すビューStudentViewModel も持っていますCourse/IndexCourseViewModel

それは私の質問の基礎を設定するはずです:私がこのオプションに従うなら大丈夫ですか、それは私が非常にきちんとしていて単純だと思います:ビューViewModelでのインスタンスを作成しますStudent/Index

 @foreach(var course in Model.Courses)
    {
       Html.RenderPartial("path/tocourse", 
        new CourseViewModel{Course = course}) ;
    }

または、私が持つことができるように、私はStudentViewModel持っList<CourseViewModel>ている必要があります:

@foreach(var courseViewModel in Model.CourseViewModels)
{
       Html.RenderPartial("path/tocourse", courseviewModel) ;
}

一見すると、上記の方が見栄えがよいかもしれませんが、Indexアクション(またはその他)では、次のことを行う必要があります。

 new StudentViewModel{
            CourseViewModels = courses.Select(c=>new CourseViewModel{copy stuff}).ToList()
       } 

私はそれが嫌いです。また、別の間接参照によってコースへのアクセスが可能になることを見て、後で混乱したり、別の開発者を混乱させたりする可能性がありますStudentViewModel.StudentModel.Courses

では、どちらがより良いアプローチですか?確かに、 ?でその問題のaまたはaのインスタンスを作成することはそれほど悪いことではありません。ViewModelModelView

4

2 に答える 2

4

これを行うのは完全にOKです。ベストプラクティスとは見なされません。ベストプラクティスは、ビューでの処理またはインスタンス化をできるだけ少なくすることです。

SOCのために、このコードをリファクタリングして、子アクションメソッドでパーシャルを使用します

Html.Action("path/tocourse");

チャイルドアクションはモデルをインスタンス化してパスし、ビューを明るくします。

[ChildActionOnly]
public ActionResult tocourse()
{

courseviewModel model = new courseviewModel();

    return PartialView(model);
}
于 2013-02-11T23:20:48.190 に答える
0

理想的には、ビューにviewmodelインスタンスロジックが含まれていてはならず、コントローラーがすべての処理を実行して、そのモデルをビューに提供する必要があります。ビューはきれいでなければなりません。また、viewmodelには、ビューに必要なプロパティのみが含まれている必要があります。これで、十分に複雑なモデルを作成できますが、特定のモデルがビューにとって非常に複雑であることに気付いた場合は、ビューに必要なプロパティが制限された、そのビューに固有のビューモデルを作成してください。

于 2013-02-12T00:08:19.903 に答える