2011-04-12 54 views
12

我意识到最好的做法是使用强类型视图并传递ViewModel中所有需要的数据,但我很好奇是否存在实际上被认为是“最佳实践”的ViewBag/ViewData中传递数据的情况。什么时候在ASP.NET MVC中使用ViewBag/ViewData“可以接受”?

在什么情况下ViewBag/ViewData首选将数据传递给视图?

更新

我们很高兴地听到各种用途每个人都拿出了ViewBag/ViewData的。我们可能永远不会达到“最佳实践”,但能够看到人们依赖ViewBag/ViewData提供的不同解决方案将非常棒。

回答

9

我使用它们很少,对于一些完全无关的,我正经过到视图模型或视图模型的信息位,再次,大部分的时间我使用视图模型

+1

如果您将信息传递给视图的布局,那么我可以看到的只有当视图模型中不包含信息时才能看到的唯一场景。对于这种情况,我喜欢使用基本ViewModel,它由属于所有使用特定布局的视图的ViewModel继承。 – SamStephens 2011-09-05 04:53:48

2

我更喜欢使用一些DTO,而不是使用viewbag。使用DTO可以让你强大的输入你的viewdata。

希望这会有所帮助。

+0

你会使用这个方法,除此之外还是代替强制输入视图?为什么不直接将视图键入到DTO(或从其派生的视图模型)? – stephen776 2011-04-12 15:50:22

+0

这就是我所做的,我用DTO强烈地输入了我的观点。我尽量避免使用视图包。但在某些情况下,如错误,你可以将它们传递给viewbag – alexl 2011-04-12 15:53:02

1

我不能说最佳做法,但我主要在使用编辑器模板时使用它。例如,如果我想显示的下拉列表编辑某些领域我提出以下编辑模板

<%:Html.DropDownList("GetIDHere", new SelectList((IEnumerable<someModel>)ViewData["xyz"]),"select Author")%> 

那你就把UIHint属性对你的模型的BookID领域例如

public class Book 
{ 
    public int BookID{get;set;} 
    [UIHint("mytemplate")] 
    public int AuthorID{get;set;} 
} 

在这种情况下,我假设,它使用ViewData特别精细和干净。这是Telerik asp.net mvc项目在其演示项目中编码的方式demo

+1

有一个参数可以用来代替使用一个ViewModel,一个'Book'属性和一个'IEnumerable '属性,给你强大的输入。 – SamStephens 2011-09-05 04:31:47

2

我通常会使用强类型视图来显示任何内容,但通常会将ViewBag.Member设置为当前登录的成员,以便可以使用它在主布局中除了具体的视图外。

我有一个名为PopulateMemberContext的属性,它填充ViewBag.Member,我该属性添加到我的基本控制器让每一个视图总是有必要的数据。

“正确”或“错误”我不知道 - 但它奇妙地工作。

+2

这就是User.Identity属性的用途 - 只要您的自定义身份验证机制是MembershipProvider的实现,就会工作。 – 2012-12-07 13:59:16

相关问题