Nat*_*Pet 33 asp.net-mvc razor viewbag
对于ViewBag,我听说这是禁止使用的.我会假设ViewBag中的内容应该合并到视图模型中吗?
题:
我的假设是最佳实践.(不使用ViewBag,第二个在视图模型中使用它)
是否存在绝对需要ViewBag的情况?
Shy*_*yju 31
ViewBag是一个动态字典.因此,当使用ViewBag在操作方法和视图之间传输数据时,如果在尝试访问视图中的ViewBag项时在代码中输入错误,编译器将无法捕获.您的视图将在运行时崩溃:(
通常,最好使用视图模型在操作方法和视图之间传输数据.view model是一个简单的POCO类,它具有特定于视图的属性.因此,如果要传递一些额外的数据进行查看,请向视图模型添加新属性并使用该属性.强大的类型视图使代码更清晰,更易于维护.使用这种方法,您不需要将viewbag字典项显式地转换为某些类型来回与视图包有关.
public class ProductsForCategoryVm
{
public string CategoryName { set;get; }
public List<ProductVm> Products { set;get;}
}
public class ProductVm
{
public int Id {set;get;}
public string Name { set;get;}
}
Run Code Online (Sandbox Code Playgroud)
在您的操作方法中,创建此视图模型的对象,加载属性并将其发送到视图.
public ActionResult Category(int id)
{
var vm= new ProductsForCategoryVm();
vm.CategoryName = "Books";
vm.Products= new List<ProductVm> {
new ProductVm { Id=1, Name="The Pragmatic Programmer" },
new ProductVm { Id=2, Name="Clean Code" }
}
return View(vm);
}
Run Code Online (Sandbox Code Playgroud)
并且您的视图是视图模型的强类型,
@model ProductsForCategoryVm
<h2>@Model.CategoryName</h2>
@foreach(var item in Model.Products)
{
<p>@item.Name</p>
}
Run Code Online (Sandbox Code Playgroud)
很多教程/书籍都有代码示例,它们使用ViewBag作为下拉数据.我个人仍然认为ViewBag不应该用于此.它应该是List<SelectListItem视图模型中类型> 的属性,以传递下拉数据.这是一篇帖子,其中包含有关如何执行此操作的示例代码.
是否存在绝对需要ViewBag的情况?
有一些有效的用例,您可以(不必要)使用ViewBag发送数据.例如,要在"布局"页面上显示某些内容,可以使用ViewBag.另一个示例是ViewBag.Title (对于页面标题)存在于默认MVC模板中.
public ActionResult Create()
{
ViewBag.AnnouncementForEditors="Be careful";
return View();
}
Run Code Online (Sandbox Code Playgroud)
在布局中,您可以阅读 ViewBag.AnnouncementForEditors
<body>
<h1>@ViewBag.AnnouncementForEditors</h1>
<div class="container body-content">
@RenderBody()
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
Sad*_*ran 31
1)我的假设是否是最佳实践.(不使用ViewBag,第二个在视图模型中使用它)
您应该使用viewmodels而不是通过ViewBag尽可能多地传递数据.
2)是否存在绝对需要ViewBag的情况?
没有ViewBag绝对必要的情况.但是,有些数据我个人更喜欢使用ViewBag而不是View Model.例如,当我需要填充预定义值(即Cities)的下拉框时,我使用ViewBag来携带SelectListItem数组来查看.我不想用这些数据污染我的ViewModel.
1)我的假设是否高于最佳实践。(不要使用 ViewBag,然后在视图模型中使用它)
是的。
2) 是否存在绝对需要 ViewBag 的情况?
不。您存储在 ViewBag 中的所有内容都可以进入传递给视图的视图模型。
| 归档时间: |
|
| 查看次数: |
28545 次 |
| 最近记录: |