2016-07-25 9 views
1

私は新しい仕事を始めました.MVC 5を使用してアプリケーションを作成する必要があります。.NETでの経験がないので、ベストプラクティスを使用しているかわかりません。コントローラからビューMVCにオブジェクトを渡す

私はViewBag

IList<ClassRom> classes = db.Classes.ToList(); 
IList<Student> students = db.Students.ToList(); 
ViewBag.classes = classes; 
ViewBag.students = students; 
return View(); 

とビュー

内のデータを使用してを使用してビューにコントローラから> ICollectionを<を渡しています2つのモデルClassRomや学生、

public class Student 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class ClassRom 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

を持っています

<div> 
@foreach (var student in ViewBag.students) 
{ 
    <div>@student.Name</div> 
    <div>@student.Age</div> 
} 

それは私が足場コントローラを追加する場合、それはこのようなものが作成されますとにかく、私は必要なもののためにかなりうまく機能:

public ActionResult Index() 
    { 
     return View(db.Students.ToList()); 
    } 

とビュー

@model IEnumerable<School.Models.Student> 
@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Name) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Age) 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | 
     @Html.ActionLink("Details", "Details", new { id=item.ID }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.ID }) 
    </td> 
</tr> 

}

私を質問は、間違っているのですか?私はViewBagの代わりに@model IEnumerableを使うべきですか?

+1

ViewBagを使用してデータを転送する人もいれば、強く型付けされたユーザーもいます(2番目の方法)。私は個人的にViewData/ViewBagを避け、強く型付けされたアプローチを使用することを好みます。 1つの違いは、ORMツールから作成したエンティティクラスを使用しないことです(ビューがそのクラスに密接に結合される)。代わりにビュー固有のビューモデル(POCO)を使用します。あなたにいくつかのアイデアを与えるために、[ここでは良い読んだ](http://stackoverflow.com/questions/11262034/mvc-viewbag-best-practice) – Shyju

答えて

1

ので@model IEnumerableを使用することをお勧めし:それは静的に型付けされ

  • ViewBagは動的なので、型の安全性が失われます。
  • これは、コンポーネント(ViewModelsおよびModelsを再利用できる)がよりクリーンな設計につながります。

PS:ClassRomClassRoomと思われます。

幸運を祈る!

+0

'ViewBag'(または他の方法で)モデル/ビューモデルをより再利用可能にしますか? – Luke

+0

@ルーク「ViewBag」を使用してコントローラからビューに値を渡すとき、 'Model'または' ViewModel'はありません。したがって、クラスを再利用する方法はありません。 –

+0

それは私には意味がありません。もちろん、クラスを再利用できます。 – Luke

1

通常は、@model@Modelを使用してモデルを使用してください。 @model(小文字)は、モデルのTYPEを定義するために使用されます。

あなたがあなた自身のクラスのインスタンスを渡した場合は、以下のとおり

public class MyClass 
{ 
    public IEnumerable<string> MyProperty { get; set; } 
} 

あなたは@model MyClassようなタイプを定義し、あなたのビューで@Model.MyPropertyを使用して値にアクセスします。

一般的に、ViewBagを使用してモデルをビューに渡すのではなく、ビュー内で@Modelを使用してアクセスすることはできません。 @Modelを使用して、ビューにアクセスする値ためには、あなたがそうのように返される合格する必要があります:ビューを作成するときに

public ActionResult Index() 
{ 
    // Create your model and set the values 
    var myModel = new MyClass 
    { 
     MyProperty = new List<string> { "First Value", "Second Value" } 
    }; 

    // Return the model back to your view for access using @Model 
    return View(myModel); 
} 
1

私はいつもモデルを使用します。ビューバックは私の好みには余りにも緩いです。 IEnumerableは、モデルの観点からは不変のコレクションなので、モデルにとっては問題ありません。

関連する問題