asp.net-mvc – ViewBag vs Model,在MVC.NET中

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ViewBag vs Model,在MVC.NET中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这更像是一个通用的架构问题:

我试图决定我的程序员是否可以使用“ViewBags”将数据传递给已经接受模型的视图.@H_403_3@

我个人的偏好是避免使用ViewBags并构建包含视图所需的所有数据的Robust Models:@H_403_3@

方法1:@H_403_3@

  1. MODEL A:
  2. - List of Employees
  3. - Nullable integer,indicating which item from the list is currently selected
  4. - string firstName (empty if index is null)
  5. - string lastname (empty if index is null)

方法2:@H_403_3@

  1. MODEL A:
  2. - List of Employees
  3.  
  4. ViewBag:
  5. - ViewBag.Index (indicating which item from the list is currently selected)
  6. - ViewBag.FirstName
  7. - ViewBag.LastName

谁能想到一个争论为什么Approach2会比接近1更好?@H_403_3@

感谢您的输入@H_403_3@

解决方法

在我看来,如果没有非常好的理由,你绝不应该使用ViewBag. Brad Thomas’ answer指出了其中一个很好的理由的罕见例子.

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

>将布局属性添加到每个模型.@H_403_3@

如果你没有很多模型,或者只有一两个额外的属性,这可能会有效.这很快就会成为维护的噩梦.@H_403_3@

>让所有模型都从包含布局数据的类继承.@H_403_3@

我避免创建一个ModelBase类,但有时可能是必要的.@H_403_3@

>为布局和通用模型基类创建模型.@H_403_3@

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

  1. abstract class ModelBase<TLayout> {
  2. public TLayout Layout { get; set; }
  3. }
  4.  
  5. class Model : ModelBase<LayoutModel2> { /* model stuff here */ }

>在ViewBag中放置布局属性.@H_403_3@

在极少数情况下我可以想象将布局信息放在模型中是不正确的调用.人们使用他们的域模型作为他们的模型似乎很平常,例如,您可能不希望将布局/视图数据与业务/域数据混合在一起.@H_403_3@

如果您决定使用ViewBag,请避免这样做:@H_403_3@

  1. ViewBag.Title = "My page"
  2. ViewBag.UserID = 123
  3. ViewBag.UserName = "admin"
  4. ViewBag.UserDisplayName = "Administrator"

存在明显的潜在问题,例如在不同的地方使用不同的大写(例如UserId而不是UserID).不太明显的是,有人可能会意外地将ViewBag.UserID设置为字符串或Nullable< int>:@H_403_3@

  1. class SomeOtherClass {
  2. public string UserID { get; set; } // someone uses a string...
  3. }
  4.  
  5. ViewBag.UserID = someOtherClassObj.UserID; // now you're in trouble.

因此,如果您必须使用ViewBag,我建议这样的事情:@H_403_3@

  1. ViewBag.LayoutModel = new LayoutModel { UserID = User.ID,UserName = User.Name };

猜你在找的asp.Net相关文章