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

时间:2016-07-25 16:46:40

标签: .net asp.net-mvc entity-framework viewbag

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

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

它非常适合我需要的东西,无论如何,如果我添加一个Scaffolded Controller,它会创建这样的东西:

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

3 个答案:

答案 0 :(得分:2)

在正常情况下,您应该在视图中使用@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 :(得分:1)

最好使用@model IEnumerable,因为:

  • 它是静态类型的。 ViewBag是动态的,因此您会失去类型安全性。
  • 它带来了更清晰的设计,其中组件(ViewModelsModels可以重复使用)。

PS:ClassRom应该是ClassRoom我相信。

祝你好运!

答案 2 :(得分:1)

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