asp.net-mvc - MVC.NET 中的 ViewBag 与模型

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

关闭。这个问题是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.UserIDstringNullable<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/

    相关文章:

    c# - DDD : (Domain And ViewModel)=> common Behaviors

    asp.net-mvc - 使用编辑器下拉列表值更新 Kendo 网格

    c# - Razor View 中的字符串插值?

    c# - 新的 MVC Area _layout 不继承....System.Web.WebPages.StartPage

    c# - 在 Asp.net MVC4 中访问 ViewBag 时出现 NullReferenceException

    asp.net-mvc-3 - 无法在 ASP.NET MVC3 中的部分 View 中访问 ViewBag

    asp.net-mvc - 如何使用 ViewBag 创建下拉列表?

    sql - 流利的 Nhibernate 和 MVC

    asp.net-mvc-3 - 使用 ViewModel 时不显示 MVC3 自定义验证错误消息

    asp.net-mvc - MVC View 渲染不尊重 View 模型中传递的数据