Asp.net mvc ViewBag vs Model,在MVC.NET中
这更像是一个通用的体系结构问题: 我试图决定程序员是否可以使用“ViewBags”将数据传递给已经接受模型的视图 我个人的偏好是避免使用ViewBag,并构建包含视图所需所有数据的健壮模型: 方法1:Asp.net mvc ViewBag vs Model,在MVC.NET中,asp.net-mvc,viewbag,asp.net-mvc-viewmodel,Asp.net Mvc,Viewbag,Asp.net Mvc Viewmodel,这更像是一个通用的体系结构问题: 我试图决定程序员是否可以使用“ViewBags”将数据传递给已经接受模型的视图 我个人的偏好是避免使用ViewBag,并构建包含视图所需所有数据的健壮模型: 方法1: MODEL A: - List of Employees - Nullable integer, indicating which item from the list is currently selected - string firstName (empty if index is nul
MODEL A:
- List of Employees
- Nullable integer, indicating which item from the list is currently selected
- string firstName (empty if index is null)
- string lastname (empty if index is null)
MODEL A:
- List of Employees
ViewBag:
- ViewBag.Index (indicating which item from the list is currently selected)
- ViewBag.FirstName
- ViewBag.LastName
方法2:
MODEL A:
- List of Employees
- Nullable integer, indicating which item from the list is currently selected
- string firstName (empty if index is null)
- string lastname (empty if index is null)
MODEL A:
- List of Employees
ViewBag:
- ViewBag.Index (indicating which item from the list is currently selected)
- ViewBag.FirstName
- ViewBag.LastName
有人能想出一个理由来解释为什么方法2比方法1更好吗
谢谢你的意见你能用吗?当然你应该用它吗?这取决于你还想做什么。通常,您会看到ViewBag保留用于发送页面标题等数据。您可能希望在模型中保留从数据库填充的参数。主要是因为模型绑定以及您是否曾经想要执行模型验证 当将信息传递到视图的布局时我个人会选择模型作为参数,因为模型是强类型的,所以当它传递到视图时,我们还可以在字段关键字中控制参数是否有效。 模型是未来代码维护的最佳方式 这方面的参考:
这取决于具体情况,如果要传递的字段仅用于此特定视图,并且它们可能不作为实体或模型的一部分,那么我将使用viewbags,否则我将使其成为模型。在我看来,您应该在没有非常重要的,很好的理由。指出一个罕见的例子,说明其中一个好的理由 假设你有一个被整个网站共享的master(或a)和几十个强类型视图,每个视图都有自己的模型。如何将数据传递到布局?我见过一些策略:
ModelBase
类,但有时可能需要创建
抽象类模型库{
公共TLayout布局{get;set;}
}
类模型:模型库{/*这里的模型材料*/}
如果您决定使用
ViewBag
,请避免:
ViewBag.Title=“我的页面”
ViewBag.UserID=123
ViewBag.UserName=“admin”
ViewBag.UserDisplayName=“管理员”
存在明显的潜在问题,比如在不同的地方使用不同的大写字母(例如,UserId
而不是UserId
)。不太明显的是,有人可能会意外地将ViewBag.UserID
设置为字符串或Nullable
:
class-SomeOtherClass{
公共字符串UserID{get;set;}//有人使用字符串。。。
}
ViewBag.UserID=someOtherClassObj.UserID;//现在你有麻烦了。
因此,如果您必须使用ViewBag
,我建议您这样做:
ViewBag.LayoutModel=newlayoutmodel{UserID=User.ID,UserName=User.Name};
请详细说明您的答案,并给出具体的理由,说明为什么您选择的是什么而不仅仅是观点。我还发现,立即将其转换回对应的.cshtml文件顶部的原始类型也可以稍微缓解ViewBag的问题。“因为我懒惰”是一个非常非常好的理由吗?