将对象从控制器传递到视图 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
是动态的,所以你失去了类型安全。
- 这会带来更简洁的设计,组件(
ViewModels
和 Models
可以重复使用)。
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 适用于模型,因为从模型的角度来看,它是一个不可变的集合。
我开始了一份新工作,我们必须使用 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
是动态的,所以你失去了类型安全。 - 这会带来更简洁的设计,组件(
ViewModels
和Models
可以重复使用)。
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 适用于模型,因为从模型的角度来看,它是一个不可变的集合。