Dot*_*t98 13 asp.net-mvc viewbag asp.net-mvc-viewmodel
这更像是一个通用的架构问题:
我试图决定我的程序员是否可以使用"ViewBags"将数据传递给已经接受模型的视图.
我个人的偏好是避免使用ViewBags并构建包含视图所需的所有数据的Robust Models:
方法1:
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)
Run Code Online (Sandbox Code Playgroud)
方法2:
MODEL A:
- List of Employees
ViewBag:
- ViewBag.Index (indicating which item from the list is currently selected)
- ViewBag.FirstName
- ViewBag.LastName
Run Code Online (Sandbox Code Playgroud)
任何人都可以想到为什么Approach2会优于方法1?
感谢您的输入
Dav*_*rtz 16
在我看来,如果没有一个非常非常好的理由,你就永远 ViewBag 不应该使用.布拉德托马斯的答案指出了一个很好的例子,其中一个很好的理由.
假设您有一个由整个网站共享的主布局(或部分视图)和几十个强类型视图,每个视图都有自己的模型.如何将数据传递给布局?我见过的一些策略:
如果你没有很多模型,或者只有一两个额外的属性,这可能会有效.这很快就会成为维护的噩梦.
我避免创建一个ModelBase类,但有时可能是必要的.
我见过MVC应用程序有几种布局,任何视图都可以使用.如果模型继承自基类,则可能需要为每个布局都有一个基类.为了避免重复工作,我将为每个布局创建一个布局模型.那么像这样的东西可能适合你:
abstract class ModelBase<TLayout> {
public TLayout Layout { get; set; }
}
class Model : ModelBase<LayoutModel2> { /* model stuff here */ }
Run Code Online (Sandbox Code Playgroud)
ViewBag.在极少数情况下我可以想象将模型中的布局信息放在正确的调用中.人们使用他们的域模型作为他们的模型似乎很平常,例如,您可能不希望将布局/视图数据与业务/域数据混合在一起.
如果您决定使用ViewBag,请避免这样:
ViewBag.Title = "My page"
ViewBag.UserID = 123
ViewBag.UserName = "admin"
ViewBag.UserDisplayName = "Administrator"
Run Code Online (Sandbox Code Playgroud)
存在明显的潜在问题,例如在不同的地方使用不同的大写(例如,UserId而不是UserID).不太明显的是,有人可能会意外地设置ViewBag.UserID为string或Nullable<int>:
class SomeOtherClass {
public string UserID { get; set; } // someone uses a string...
}
ViewBag.UserID = someOtherClassObj.UserID; // now you're in trouble.
Run Code Online (Sandbox Code Playgroud)
所以如果你必须使用ViewBag,我会推荐这样的东西:
ViewBag.LayoutModel = new LayoutModel { UserID = User.ID, UserName = User.Name };
Run Code Online (Sandbox Code Playgroud)
我个人会选择Model作为参数,因为model是强类型的,所以当它传递给view时,我们也可以控制我们的参数在field关键字中是否有效.模型是未来代码维护的最佳方式.
参考:
小智 2
你能用吗?当然。你应该使用它吗?取决于您还想做什么。通常您会看到 ViewBag 保留用于发送页面标题等数据或类似的内容。您可能希望将从数据库填充的参数保留在模型中。主要是因为模型绑定以及您是否想要执行模型验证。
| 归档时间: |
|
| 查看次数: |
15929 次 |
| 最近记录: |