重用Viewbag中存储的变量,性能如何? (回收Viewbags)

时间:2013-05-28 15:17:43

标签: c# asp.net-mvc performance viewbag

当我想到ViewBag时,我将其与“最终说法相关联。”

意味着你完成所有逻辑并将结果设置为它。

ViewBag.A = Some crazy math formula;
ViewBag.B = Another crazy math formula;
ViewBag.GrandTotal = Some crazy math formula + Another crazy math formula;

这也有效:

ViewBag.A = Some crazy math formula;
ViewBag.B = Another crazy math formula;
ViewBag.GrandTotal = ViewBag.A + ViewBag.B;

Yipes,我正在使用在运行时制定的变量!

这无论如何都是荒谬或低效的?

2 个答案:

答案 0 :(得分:6)

tl;博士:ViewBag是一个懒散的过度使用“退出监狱免费卡”存储数据基本上让你说“嘿,只是在运行时抛出错误,所以谁真的关心?“

  

这无论如何都是荒谬的吗?

绝对是最好的!如果您完全基于ViewBag值执行复杂的逻辑/公式,那么您只是为大量潜在的运行时错误打开了大门。

你应该非常强烈地输入它们,把它们放在模型中。那么至少可以通过这种方式减轻某些潜在的运行时错误或实现中可能存在的缺陷。

对我来说,ViewBagViewBag.Title除外)的唯一合理用途是,当您的模型可以多种不同类型且无关联时(如果这些类型是相关的,你可以将它们全部来自一个共同的项目并将你的财产放在那个项目上。)

这是MVC(模型视图控制器),而不是VVC(ViewBag View Controller),这是一些人似乎认为/实现的。

就性能而言,我说差异是 insignifiant 以保证使用它。

答案 1 :(得分:3)

你的第二个选择显然比第一个更有效。这与使用ViewBag无关,只是你只执行一次计算。

除此之外,使用ViewBag效率不高,因为您需要装箱以在堆上放置值类型,然后使用强制类型将值放入视图中。

正确的方法是通过模型:

public class MyModel{

    public decimal A {get; set; }
    public decimal B {get; set; }
    public decimal GrandTotal { get { return A + B;}}
}

然后在你的控制器中实例化这个类,把变量放入并传递给视图:

** snip **
MyModel model = new MyModel {A = some crazy formula, B = another crazy formula};
return View(model);