Asp.net mvc ViewBag vs Model,在MVC.NET中

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

这更像是一个通用的体系结构问题:

我试图决定程序员是否可以使用“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 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
    类,但有时可能需要创建

  • 为布局和通用模型基类创建模型。
  • 我见过MVC应用程序有几种布局,任何视图都可以使用。如果模型继承自基类,则可能需要为每个布局创建基类。为了避免重复工作,我将为每个布局创建一个布局模型。那么像这样的东西可能适合你:

    抽象类模型库{
    公共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的问题。“因为我懒惰”是一个非常非常好的理由吗?