什么情况下在ASP.NET MVC中使用ViewBag/ViewData是“可接受”的?

13

我知道最佳实践是使用强类型视图并在ViewModel中传递所有所需数据,但我想知道是否有情况下将数据传递给ViewBag/ViewData被认为是“最佳实践”。

在哪些场景下ViewBag/ViewData更适合用于向视图传递数据?

更新

很高兴听到大家对ViewBag/ViewData提出的各种用途。我们可能永远无法得出“最佳实践”,但看到人们依赖ViewBag/ViewData构建的不同解决方案将是非常棒的。

4个回答

11

我很少使用它们,只用于与我传递给视图的模型或视图模型完全无关的信息片段,大多数情况下我使用视图模型。


2
我唯一能想到的情况是,当您需要将信息传递给视图的布局时,这些信息不属于ViewModel。对于这种情况,我喜欢使用一个基本的ViewModel,该ViewModel由使用特定布局的所有视图所属的ViewModel继承。 - SamStephens

2

我倾向于使用一些DTO而不是使用viewbag。使用DTO可以让你强类型化你的视图数据。

希望这有所帮助。


你会使用这种方法,除了强类型化视图之外,或者代替强类型化视图吗?为什么不直接将视图强类型化为DTO(或从DTO派生的视图模型)? - stephen776
这是我的做法:我使用DTO强类型化我的视图。我尽量避免使用ViewBag,但在某些情况下,比如错误信息,你可以将它们传递到ViewBag中。 - alexl

2

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

我有一个名为PopulateMemberContext的属性,它会填充ViewBag.Member,我将该属性添加到我的基本控制器中,以便每个视图都始终具有必要的数据。

“对”或“错”我不知道 - 但它非常有效。


2
这就是User.Identity属性的用途 - 只要您的自定义身份验证机制实现了MembershipProvider,它就可以工作。 - Daniel Lo Nigro

1
我不能说什么是最佳实践,但我大多数情况下在使用编辑器模板时使用它。例如,如果我想要显示一个下拉列表来编辑某个字段,我会创建以下编辑器模板。
<%:Html.DropDownList("GetIDHere", new SelectList((IEnumerable<someModel>)ViewData["xyz"]),"select Author")%>

然后,你可以在模型的BookID字段上放置UIHint属性,例如:

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<someModel>属性,从而为您提供强类型。 - SamStephens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接