2015-01-07 3 views
1

У меня есть контроллер, как это:Как получить значение переменной сеанса и установить в переменной контроллера?

public class LoginController : Controller 
{ 
    private Int32 _companyID; 

    // My actions 
} 

Эта переменная _companyID должна (очевидно) содержит идентификатор компании, и это значение в настоящее время на сессии. Я хочу получить это значение и установить его в переменной контроллера.

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

В WebForms я просто получил значение из сеанса в событии загрузки страницы, и это будет сделано. Но в MVC я не знаю, как я это делаю.

Моя первая мысль была получить это значение в конструкторе, что-то вроде этого:

public LoginController() 
{ 
    _companyID = Convert.toInt32(Session["companyID"]); 
} 

Но я обнаружил, что сессия не может быть доступна на конструкторах (это был пустой для меня).

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

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    Int32 _companyID = Convert.toInt32(HttpContext.Current.Session["idEmpresa"]); 

    // I couldn't pass this value directly to the controller variable 
} 

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

Есть ли способ получить это?

Я надеюсь, что мой вопрос достаточно ясен. Заранее спасибо!

ответ

1

Во-первых, переменная не является глобальной, это переменная экземпляра на контроллере. Немного педантичный, да, но это совершенно разные вещи.

Во-вторых, нет смысла устанавливать ivar на контроллере со значением из сеанса, так или иначе, поскольку контроллер создается и настраивается с каждым запросом. Другими словами, это никогда не разделяется между действиями, независимо; каждый раз, когда вы вызываете новое действие, он должен повторно установить ivar.

И, наконец, пока вы можете использовать фильтр, это не нужно из-за последней точки. Если вам нужна переменная сеанса в действии контроллера, просто получите доступ к ней непосредственно из этого действия. Если вам нужно передать его в представление, вы можете установить его в ViewBag или на модели представления.

+0

Я понимаю вашу точку зрения, но я должен проверить некоторые вещи об этом значении с сеанса (я забыл упомянуть об этом в своем вопросе, извините), и я не хочу дублировать этот код при каждом действии. Я хочу где-то отделить этот код и просто использовать значение в переменной контроллера в своих действиях. Я могу сделать это? –

+0

Затем выведите код в частный метод на контроллере и вызовите этот частный метод в каждом действии. –

+0

Я думал, что был бы способ сделать это, не изменяя все мои действия. Так нет? –

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