ASP.NET MVC, ActionFilters, статические классы и передача данных вокруг
-
03-07-2019 - |
Вопрос
Я хотел бы услышать ваше мнение и, возможно, лучшие предложения для следующего сценария:
Я определил пользовательский ActionFilter, который выполняет некоторую работу и имеет какое-то значение. Я хотел бы использовать это значение в действиях контроллера и в моделях.
Теперь я могу использовать TempData для передачи этого значения из ActionFilter в любой метод действия контроллера, а затем распространить это значение среди всех моделей, которые передаются в возвращенные представления.
Я уверен, что это будет работать, но эти TempData будут там во время сеанса, где и когда они больше никому не нужны. Предполагается, что значение будет использоваться исключительно в коде во время одного запроса, после которого оно фактически аннулируется.
У меня есть два варианта:
<Ол>В ActionFilter я устанавливаю это значение в TempData в OnActioExecuting () и удаляю его в OnActionExecuted (). Правильно ли я понимаю, что к моменту вызова OnActionExecuted действие контроллера завершено, ответ уже сгенерирован, и это содержимое TempData еще не дошло до сеанса YET?
В любом из моих пользовательских статических классов (логика) я просто определяю открытое свойство для этого значения и использую его всякий раз, когда это необходимо. Не будет ли потеряно это статическое поле между OnActionExecuting () и фактическим выполнением метода контроллера? Существуют ли другие проблемы, связанные с возможностью потери этого значения во время обработки запроса на сервере?
Есть ли другие / лучшие варианты, которые я еще не рассмотрел?
Решение
Я обнаружил, что использование ActionParameters
делает ваш код очень легко тестируемым. Вы можете сделать это так:
// inside your actionfilter
public override void OnActionExecuting(ActionExecutinContext context)
{
var someData = // ... load some data
context.ActionParameters["someData"] = someData;
}
// and then in your action method
[ProvideSomeData]
public ViewResult Index(SomeData someData)
{
// someData will be populated in here
}
Другие советы
re: # 2
Просто хотел указать, что проблема со статическим полем состоит в том, что все запросы будут использовать одно и то же статическое поле. Если у вас есть два запроса, выполняющихся одновременно, всегда есть вероятность, что запрос B перезапишет значение запроса A, и вы будете использовать неправильное значение при выполнении действия для запроса A. Р>
Я бы не использовал статические члены для хранения информации, специфичной для запроса. Р>