ASP.NET MVC, ActionFilters, статические классы и передача данных вокруг

StackOverflow https://stackoverflow.com/questions/817838

Вопрос

Я хотел бы услышать ваше мнение и, возможно, лучшие предложения для следующего сценария:

Я определил пользовательский 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.

    Я бы не использовал статические члены для хранения информации, специфичной для запроса.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top