【问题标题】:When is it "acceptable" to use ViewBag/ViewData in ASP.NET MVC?什么时候在 ASP.NET MVC 中使用 ViewBag/ViewData 是“可接受的”?
【发布时间】:2011-04-12 15:43:39
【问题描述】:

我意识到最佳实践是使用强类型视图并在 ViewModel 中传递所有需要的数据,但我很好奇是否存在实际上认为“最佳实践”在 ViewBag/ViewData 中传递数据的情况.

在什么情况下,ViewBag/ViewData 更适合将数据传递给视图?

更新

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我很少使用它们,因为与我传递给视图的模型或视图模型完全无关的信息位,同样,大多数时候我使用视图模型

    【讨论】:

    • 当您拥有不属于 ViewModel 的信息时,我能看到的唯一情况是您将信息传递给 View 的布局。对于这种情况,我喜欢使用基础 ViewModel,它由属于使用特定布局的所有 View 的 ViewModel 继承。
    【解决方案2】:

    我更喜欢使用一些 DTO 而不是使用 viewbag。使用 DTO 可以让您对视图数据进行强类型化。

    希望这会有所帮助。

    【讨论】:

    • 您会使用这种方法来补充或代替强输入视图吗?为什么不直接将视图强输入到 DTO(或从它派生的视图模型)?
    • 这就是我所做的,我使用 DTO 强烈键入我的视图。我尽量避免使用 viewbag。但在某些情况下,例如错误,您可以将它们传递给 viewbag
    【解决方案3】:

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

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

    “正确”或“错误”我不知道 - 但效果非常好。

    【讨论】:

    • 这就是 User.Identity 属性的用途 - 只要您的自定义身份验证机制是 MembershipProvider 的实现,这将起作用。
    【解决方案4】:

    我不能说最佳实践,但我主要在使用编辑器模板时使用它。例如,如果我想显示一个用于编辑某些字段的下拉列表,我会创建以下编辑器模板

    <%: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

    【讨论】:

    • 这里有一个论点是要改用 ViewModel,它有一个 Book 属性和一个 IEnumerable&lt;someModel&gt; 属性,给你强类型。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2013-05-28
    • 2011-06-09
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多