Повторное использование переменных, хранящихся в 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 2

2 ответа:

Tl; dr: ViewBag - это лениво используемая "get out of jail free card" для хранения данных, которая в основном оставляет вас говорить: "Эй, просто бросайте ошибки во время выполнения, так что кого это действительно волнует?"

Разве это в любом случае абсурдно?

Совершенно определенно! Если вы выполняете сложную логику/формулы, полностью основанные на значениях ViewBag, то вы просто открываете дверь для загрузки потенциальных ошибок во время выполнения.

Вы должны действительно сильно печатать их, помещать их в модели. Тогда, по крайней мере, таким образом вы можете облегчить некоторые потенциальные ошибки во время выполнения или возможные недостатки в вашей реализации.

Для меня единственное правдоподобное использование ViewBag (кроме ViewBag.Title) - это когда ваша модель может быть многими различными типами, которые никоим образом не связаны (если бы типы были связаны, вы бы все их производили от общего элемента и помещали свое свойство на этот элемент).

Это MVC (Model View Controller), а не VVC (ViewBag View Controller), который является то, что некоторые люди, кажется, думают/реализуют.

С точки зрения производительности, я бы сказал, что разница незначительна, чтобы оправдать ее использование.

Ваш второй вариант, очевидно, более эффективен, чем первый. Это не имеет никакого отношения к использованию ViewBag или нет, просто вы выполняете вычисления только один раз.

Кроме того, использование ViewBag не очень эффективно, так как вам нужен boxing, чтобы поместить тип значения в кучу, а затем приведение, чтобы передать значение в представление.

Правильный способ сделать это - через модель:

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);