2

当我想到 aViewBag时,我会将它与“最终决定权”联系起来。

这意味着您执行所有逻辑并将结果设置为它。

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;

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

这到底是荒谬的还是低效的?

4

2 回答 2

6

tl;dr:这ViewBag是一个懒惰地过度使用的“越狱卡”,用于存储数据,基本上让你说“嘿,只是在运行时抛出错误,所以谁真的在乎呢?”

这到底是荒谬的吗?

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

您应该真正强烈地键入它们,将它们放入模型中。然后至少这样你可以减轻一些潜在的运行时错误或你的实现中可能存在的缺陷。

ViewBag对我来说, (除了)唯一合理的用途ViewBag.Title是当你的模型可以是许多不同类型的时候,它们完全没有关系(如果类型是相关的,你会让它们都来自一个共同的项目并把你的财产在那个项目上)。

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

在性能方面,我会说差异是微不足道的,以保证使用它。

于 2013-05-28T15:57:38.223 回答
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);
于 2013-05-28T16:04:14.147 回答