2014-11-21 2 views
0

Я пытаюсь получить доступ к методу моего MVC HomeController с другого контроллера, чтобы перенаправить пользователя на домашнюю страницу, если он не аутентифицирован. Проблема в том, что сеанс в моем HomeController не установлен, если я создаю его самостоятельно, но мне нужно получить доступ к переменной, хранящейся в сеансе, из моего HomeController. Я попытался решить проблему таким образом:Установить сеанс в ASP.Net MVC Controller из другого класса

HomeController currentHomeController = new HomeController(); 
currentHomeController.Session = this.Session; 
return currentHomeController.Index(); 

Но переменная Session не имеет сеттера, поэтому это не работает. Есть ли другой способ сделать это?

мое решение

Это работает:

return RedirectToAction("Index", "Home"); 

Спасибо за ваши ответы!

+0

** Вы не можете создать свой собственный экземпляр контроллера таким образом **, вот что вызывает все ваши проблемы. Структура ASP.NET создает экземпляры контроллеров. Если вы хотите повторно использовать методы действий, обычным способом является перенаправление клиента на нужный способ действия, например: http://stackoverflow.com/a/27057561/7724 – bzlm

ответ

2

Вы можете получить доступ к Session через Http.Context.Current

В вашем другом классе:

var myVar = HttpContext.Current.Session["MyVar"] 

Если вам нужно перенаправить на другое действие только RedirectToAction в вашем acction

return RedirectToAction("MyAction", "MyController") 
+0

Нашел это решение уже в Интернете, но HttpContext не имеет свойства «Текущий» в моем решении. Я использую ASP.Net MVC 5. –

+0

@PhilippEger вы выполняете это в веб-проекте или в другой библиотеке? –

+0

Старые веб-формы ASP.NET «Текущий» статический способ доступа к контексту HTTP обычно не используется в ASP.NET MVC. Все различные элементы контекста вводятся в экземпляр Controller Action Invoker. – bzlm

4

Для редиректа на другое действие контроллера, которое вы не создаете из него. .Вы использовать от

TempData["Key"]="lol"; 
or 
Session["key"]="lol"; 
return RedirectToAction("ActionName", "ControllerName"); 

Для сеанса вы можете хранить YOR данные в TemData [ "ключ"] или сессии [ "ключ"] и получить его ваше другое действие, как

var data=TempData["Key"]; 
Or 
var data =Session["key"]; 
0

объекта Session A контроллера предварительно заполняется каркасом. Все они указывают на тот же объект Session, так что вы можете просто использовать его без установки его

В Controller1

this.Session["MyText"] = "hello from Controller1"; 

, а затем в Controller2

model.MyText = this.Session["MyText"] as string; 

Это типичный способ передачи данных между запросами

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