将对象从控制器传递到视图 MVC

Pass Objects from a controller to a view MVC

我开始了一份新工作,我们必须使用 MVC 5 创建一个应用程序,我没有使用 .NET 的经验,所以我不确定我是否使用了最佳实践。

我有 2 个模型 ClassRom 和 Students,

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

我正在使用 ViewBag

将 ICollection<> 从控制器传递到视图
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 吗?

最好使用@model IEnumerable因为:

  • 它是静态类型的。 ViewBag 是动态的,所以你失去了类型安全。
  • 这会带来更简洁的设计,组件(ViewModelsModels 可以重复使用)。

PS: ClassRom 我相信应该是 ClassRoom

祝你好运!

在正常情况下,您应该在视图中使用使用 @model@Model 的模型。 @model(小写)用于定义模型的类型。

如果您要传递自己的 class 实例,如下所示:

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);
}

创建视图时,我总是会使用模型。 viewbag 太松了,我不喜欢。 IEnumerable 适用于模型,因为从模型的角度来看,它是一个不可变的集合。