6

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

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

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

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

я придумал два варианта:

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

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

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

ответ

8

Я обнаружил, что использование 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 
} 
+0

Довольно интересно на самом деле. Разве это так, что параметры конструктора действий будут автоматически сопоставлены с клавишами коллекции ActionParameters? – User

+0

Да, параметры действия должны быть предпочтительным способом передачи значения в контроллере. – kazimanzurrashid

+0

В конечном счете мне понравился этот подход, хотя он определенно отрицает принцип DRY. Спасибо за совет. – User

3

Re: # 2

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

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

+0

Спасибо. Я боялся чего-то подобного. Итак, эти статические поля распределяются между всеми запросами, а не каждый запрос получает свой собственный контекст? – User

+2

Правые общедоступные статические поля и свойства видны для каждого потока приложения. – OdeToCode

 Смежные вопросы

  • Нет связанных вопросов^_^