2015-10-14 4 views
1

У меня есть контроллер с именем BaseController, который унаследован всеми другими контроллерами. У меня есть конструктор BaseController, где я делаю некоторые вычисления на основе переменной patId, которую он выбирает из сеанса, и на основе этого вычисления пользователю разрешено выполнять некоторые действия.Доступ к параметру метода действия в конструкторе контроллера

Но есть контроллер MyController, действие которого впервые получает эту переменную в этом модуле из другого модуля приложения, поэтому до тех пор, пока он не будет установлен в сеанс.

public ActionResult MyAction(string patId) 
{ 
    // First time patId is been set into session 

} 

BaseController Так что мой расчет становится неправильным для этого действия. Есть ли способ получить это значение переменной в конструкторе BaseController. Чтобы я мог проверить, имеет ли значение сеанса значение null, проверьте этот параметр и установите сеанс.

Просьба предложить, если я смогу это сделать, или я могу решить проблему с любым другим способом.

+1

Невозможно обойтись только с помощью конструкторов контроллера. Не можете ли вы просто проверить, доступно ли значение в сеансе, и если это не остановит расчет? Другой вариант - перехватить все входящие запросы и извлечь из них значение, если необходимо, до того, как оно поступит в контроллер, см. [Этот поток] (http://stackoverflow.com/q/11726848/728795) для идей – Andrei

+0

Спасибо @ Andrii .. Кажется, что это поможет. Я попытаюсь выбрать второй вариант и попробую, если это поможет мне или нет. – prashant

+0

@Andrei, если я использую ActionFilter для перехвата запроса, но конструктор контроллера будет вызываться первым, чем FilterAttribute. – prashant

ответ

1

Комментарий Андрея помог мне, и я использовал thread mentioned by Andrei. Было обсуждено перехват входящего запроса. Было два подхода, которые могли мне помочь: HttpModule и Application_BeginRequest, и я решил позже.

Но я сделал это в конструкторе самого контроллера, перехватив http-запрос, используя HttpContext, который также доступен в конструкторе контроллера.

public BaseController() 
{ 
    // Check if variable exist in session 
    // else check if patId is sent through request 
    // then save it in session 

    System.Web.HttpContext.Current.Session["PatId"] = System.Web.HttpContext.Request.Form["patId"]; 

    // perform remaining calculation 
} 
Смежные вопросы