【问题标题】:ViewBag vs Model, in MVC.NET [closed]ViewBag 与模型,在 MVC.NET [关闭]
【发布时间】:2023-03-16 16:45:01
【问题描述】:

这更像是一个通用的架构问题:

我正在尝试确定我的程序员是否可以使用“ViewBags”将数据传递给已经接受模型的视图。

我个人的偏好是避免使用 ViewBags 并构建包含视图所需的所有数据的稳健模型:

方法一:

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)

方法2:

MODEL A: 
- List of Employees

ViewBag:
- ViewBag.Index (indicating which item from the list is currently selected)
- ViewBag.FirstName
- ViewBag.LastName

谁能想到为什么方法 2 比方法 1 更好的论点?

感谢您的意见

【问题讨论】:

    标签: asp.net-mvc viewbag asp.net-mvc-viewmodel


    【解决方案1】:

    你会用吗?当然。你应该使用它吗?取决于您还想做什么。通常您会看到 ViewBag 保留用于发送页面标题之类的数据或类似的内容。您可能希望在模型中保留从数据库中填充的参数。主要是因为模型绑定以及如果您想要执行模型验证。

    【讨论】:

      【解决方案2】:

      将信息传递给视图的布局时

      【讨论】:

        【解决方案3】:

        我个人会选择模型作为参数,因为模型是强类型的,所以当它传递给视图时,我们也可以在字段关键字中控制我们的参数是否有效。 而模型是未来代码维护的最佳方式。

        参考:

        Avoid Viewbag

        【讨论】:

          【解决方案4】:

          这取决于场景是什么,如果一个想要传递的字段将只在这个特定视图中使用,并且它们可能不会作为实体或模型的一部分,那么我会使用 viewbag,否则我会做到一个模型。

          【讨论】:

          • 请详细说明您的答案,并说明您选择什么而不只是意见的原因。
          【解决方案5】:

          在我看来,你应该永远使用 ViewBag 没有非常非常好的理由Brad Thomas' answer 指出了其中一个很好的理由的一个罕见例子。

          假设您有一个由整个网站共享的主控 layout(或一个 partial view)和几十个强类型视图,每个视图都有自己的模型。你如何将数据传递给布局?我见过的一些策略:

          1. 为每个模型添加布局属性。

          如果您没有很多模型,或者只有一两个额外的属性,这可能会起作用。这很快就会成为维护的噩梦。

          1. 让您的所有模型都继承自保存布局数据的类。

          我避免创建 ModelBase 类,但有时它可能是必要的。

          1. 为布局创建模型和通用模型基类。

          我见过具有多种布局的 MVC 应用程序,任何视图都可以使用这些布局。如果您的模型从基类继承,您可能需要为每个布局创建一个基类。为避免重复工作,我将为每个布局创建一个布局模型。那么这样的事情可能对你有用:

          abstract class ModelBase<TLayout> {
              public TLayout Layout { get; set; }
          }
          
          class Model : ModelBase<LayoutModel2> { /* model stuff here */ } 
          
          1. 将布局属性放入 ViewBag

          我可以想象在极少数情况下将布局信息放入模型中不是正确的调用。人们使用他们的领域模型作为他们的模型似乎很普遍,例如,您可能不想将布局/视图数据与业务/领域数据混合。


          如果您决定使用ViewBag,请避免:

          ViewBag.Title = "My page"
          ViewBag.UserID = 123
          ViewBag.UserName = "admin"
          ViewBag.UserDisplayName = "Administrator"
          

          存在明显的潜在问题,例如在不同的地方使用不同的大小写(例如UserId 而不是UserID)。不太明显的是,有人可能会不小心将ViewBag.UserID 设置为stringNullable&lt;int&gt;

          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 };
          

          【讨论】:

          • 我还发现在对应的.cshtml文件的顶部立即将其转换回原来的类型也可以稍微缓解一下ViewBag的问题。
          • “因为我很懒”是一个非常非常好的理由吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-12
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          • 2014-10-16
          相关资源
          最近更新 更多