ASP.NET MVC, ActionFilters, статические классы и передача данных вокруг - PullRequest
6 голосов
/ 03 мая 2009

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

Я определил пользовательский ActionFilter, который выполняет какую-то работу и имеет какое-то значение. Я хотел бы использовать это значение в действиях контроллера и в моделях.

Теперь я могу использовать TempData для передачи этого значения из ActionFilter в любой метод действия контроллера, а затем распределить это значение по всем моделям, которые передаются в возвращаемые представления.

Я уверен, что это будет работать, но эти TempData будут там во время сеанса, где и когда они больше никому не нужны. Предполагается, что значение будет использоваться исключительно в коде во время одного запроса, после которого оно фактически аннулируется.

Я предложил два варианта:

  1. В ActionFilter я устанавливаю это значение в TempData в OnActioExecuting () и удаляю его в OnActionExecuted (). Правильно ли я понимаю, что к моменту вызова OnActionExecuted действие контроллера завершено, ответ уже сгенерирован, и это содержимое TempData еще не дошло до сеанса YET?

  2. В любом из моих пользовательских статических классов (логика) я просто определяю открытое свойство для этого значения и использую его при необходимости. Не будет ли потеряно это статическое поле между OnActionExecuting () и фактическим выполнением метода контроллера? Существуют ли другие проблемы с возможной потерей этого значения во время обработки запроса на сервере?

Есть ли другие / лучшие варианты, которые я еще не рассмотрел?

Ответы [ 2 ]

8 голосов
/ 03 мая 2009

Я обнаружил, что использование 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
}
3 голосов
/ 04 мая 2009

re: # 2

Просто хотел указать, что проблема со статическим полем состоит в том, что все запросы будут использовать одно и то же статическое поле. Если у вас есть два запроса, выполняющихся одновременно, всегда есть вероятность, что запрос B перезапишет значение запроса A, и вы будете использовать неправильное значение при выполнении действия для запроса A.

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

...