2016-07-25 127 views
1

我開始了一項新工作,我們必須使用MVC 5創建應用程序,我沒有.NET經驗,所以我不確定我是否正在使用最佳做法。將對象從控制器傳遞到視圖MVC

我有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; } 
} 

我傳遞一個ICollection的<>從控制器使用ViewBag

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

一個視圖和使用所述數據中的圖

<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> 

}

我問題是,我做錯了嗎?我應該使用@model IEnumerable而不是ViewBag?

+1

有些人使用ViewBag傳輸數據,一些用戶強烈地鍵入方法(第二種方法)。我個人更喜歡避免ViewData/ViewBag,並嘗試使用強類型的方法。一個區別是,我不使用從我的ORM工具創建的實體類(這將使我的視圖與該類緊密耦合),而是使用視圖特定的視圖模型(簡稱POCO)。 [這裏是一個很好的閱讀](http://stackoverflow.com/questions/11262034/mvc-viewbag-best-practice)給你一些更多的想法 – Shyju

回答

1

這是更好地使用@model IEnumerable因爲:

  • 它是靜態類型。 A ViewBag是動態的,所以你失去了類型安全。
  • 它導致一個更清潔的設計,其中組件(ViewModelsModels可以重複使用)。

PS:ClassRom應該是ClassRoom我相信。

祝你好運!

+0

如何使用'@ model''ViewBag'(或其他方式)使模型/視圖模型更加可重用? – Luke

+0

@Luke當使用'ViewBag'將值從控制器傳遞到視圖時,沒有'Model'或'ViewModel'。所以沒有辦法重用這些類。 –

+0

這對我來說毫無意義,當然你可以重用這些類。 – Luke

1

在正常情況下,您應該在您的視圖中使用@model@Model@model(小寫)用於定義模型的類型。

如果你是通過你自己的類的實例,因此下面:

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對模型來說很好,因爲它是從模型角度來看的一個不可變集合。

相關問題