关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
4年前关闭。
Improve this question
这更像是一个通用的架构问题:
我试图决定我的程序员是否可以使用“ViewBags”将数据传递给已经接受模型的 View 。
我个人的偏好是避免使用 ViewBags 并构建包含 View 所需的所有数据的健壮模型:
方法一:
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
没有非常非常好的理由 . Brad Thomas' answer指出其中一个很好的理由的罕见例子。
假设您有一位大师 layout (或 partial view )由整个网站和数十个强类型 View 共享,每个 View 都有自己的模型。你如何将数据传递给布局?我见过的一些策略:
如果您没有很多模型或者只有一两个额外的属性,这可能会起作用。这很快就会成为维护的噩梦。
我避免创建
ModelBase
类,但有时可能是必要的。我见过具有任何 View 都可以使用的多种布局的 MVC 应用程序。如果您的模型继承自基类,则您可能需要为每个布局都有一个基类。为了避免重复工作,我将为每个布局创建一个布局模型。那么这样的事情可能对你有用:
abstract class ModelBase<TLayout> {
public TLayout Layout { get; set; }
}
class Model : ModelBase<LayoutModel2> { /* model stuff here */ }
ViewBag
. 我可以想象在极少数情况下将布局信息放在模型中不是正确的调用。人们使用他们的领域模型作为他们的模型似乎很常见,例如,您可能不想将布局/ View 数据与业务/领域数据混合在一起。
如果您决定使用
ViewBag
,避免这种情况:ViewBag.Title = "My page"
ViewBag.UserID = 123
ViewBag.UserName = "admin"
ViewBag.UserDisplayName = "Administrator"
存在明显的潜在问题,例如在不同地方使用不同的大小写(例如
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.
所以如果你必须使用
ViewBag
,我会推荐这样的东西:ViewBag.LayoutModel = new LayoutModel { UserID = User.ID, UserName = User.Name };
关于asp.net-mvc - MVC.NET 中的 ViewBag 与模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21716953/