我开始上一份新工作,我们必须使用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吗?
答案 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
是动态的,因此您会失去类型安全性。ViewModels
和Models
可以重复使用)。 PS:ClassRom
应该是ClassRoom
我相信。
答案 2 :(得分:1)
创建视图时我总是会使用模型。视袋太松了我不喜欢。 IEnumerable对于模型来说很好,因为它是从模型角度来看的不可变集合。