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