【问题标题】:MVC.ViewBag is wrong?MVC.ViewBag 错了吗?
【发布时间】:2014-07-08 12:57:35
【问题描述】:

我正在使用

ViewBag.Something = session.Query<Something>().ToList();

将信息从Something类传递到View并在selectList中使用

@Html.DropDownListFor(model => model.model, new SelectList(ViewBag.Something, "Id", "name"), "--Smthing--")

这很糟糕吗?我怎样才能让它变得更好?

【问题讨论】:

    标签: asp.net-mvc razor viewbag


    【解决方案1】:

    这种做法一点也不坏,但建议在我们自己的模式下拥有一个 List 属性。在你的情况下像

    public ActinResult YourActionMethod()
    {
        YourModelObject.Something = session.Query<Something>().ToList();
        // And return your view after further code statements
        return View(YourModelObject);
    }
    

    事实上,您可以创建一个SelectList 对象而不是原始列表对象,您可以在其中轻松绑定键和值并将其发送到视图。通过这种方式,您可以一次添加所有业务并构建模型,并且可以从您想要的位置填充它。稍后的 View 将只使用该模型,而不是对其应用更多智能。它很有帮助,因为您的所有值都驻留在同一个对象下,而不是模型中的一些和 ViewBag 中的一些。

    其次,如果您在多个地方没有此列表并且您没有在任何视图中重用此模型,则此做法也很好。此外,如果您想在视图之外访问此属性,例如在布局或某些正在使用您的视图的父视图中。

    您可以查看以下帖子,该帖子解释了如何将列表绑定到您的模型。

    Setting default selected value of selectlist inside an editor template

    【讨论】:

    • 那么如果我在创建和编辑视图中使用 ViewBag 会不会很糟糕?为什么不好?
    • 正如我所说的,它是 MVC 提供的一个特性,所以它实际上还不错。但是,如果它增加了可维护性,则使用此功能可能会很糟糕。如果只有一个地方需要使用它,那么您可以选择它,否则如果它用于其他地方,那么最好使用特定的属性。它的好坏取决于它的用途和需要:)。仍然建议不要遵循,因为在处理视图时,您必须绑定两个不同的对象,所以这是一种开销。如果您有嵌套页面或者父页面或子页面正在使用这些值,这仍然是可以忍受的
    【解决方案2】:

    我更喜欢将我的所有属性添加到视图模型中,但是 ViewBag 可以用于添加不太适合模型的内容。它在绑定到布局中的元素时也很有用,因为它无法访问视图的模型。

    【讨论】:

    • 如何向模型添加属性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2018-11-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多