2012-04-10 4 views
6

У меня есть переменная сеанса, установленная в моем приложении MVC. Всякий раз, когда истекает этот сеанс, и пользователь пытается обновить страницу, на которой они находятся, страница выдает ошибку, потому что сеанс больше не установлен.MVC Equivalent of Page_Load

Есть ли где-нибудь, где я могу проверить, установлен ли сеанс перед загрузкой представления? Возможно, что-то внутри файла Global.asax?

Я мог бы сделать что-то подобное в начале КАЖДОГО ActionResult.

public ActionResult ViewRecord() 
{ 
    if (MyClass.SessionName == null) 
    { 
     return View("Home"); 
    } 
    else 
    { 
     //do something with the session variable 
    } 
} 

Есть ли альтернатива этому? Что было бы лучше всего в этом случае?

+1

Вам нужен фильтр пользовательских действий, некоторые больше информации HTTP: // MSDN .microsoft.com/en-us/gg618482 –

+0

Аналогичное обсуждение здесь: http://forums.asp.net/t/1287687.aspx –

+0

В дополнение к комментарию @ ChrisDiver, если вам нужно, это применимо ко всем вашим контроллерам/действиям , вы можете украсить базовый контроллер, из которого наследуются все остальные контроллеры. – Chris

ответ

0

Прежде всего, вы должны перенаправить на главную страницу, а не на возврат дома, иначе у вас будет странная ситуация с домашней страницей, несмотря на то, что Url находится где-то в другом месте.

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

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

К сожалению, это, вероятно, случай The XY Problem. У вас есть проблема, и вы считаете, что сессия решает вашу проблему, но у вас возникает другая проблема с Session, поэтому вы спрашиваете, как решить проблему сеанса, а не как решить проблему, которую пытается решить Session.

Какова реальная проблема, которую вы пытаетесь решить с помощью этого?

EDIT:

Основываясь на ваш комментарий ниже, почему вы не сдали номер клиента на URL:

http://website/Controller/ViewRecord/3 

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID 
} 
+0

Веб-приложение позволяет искать клиента. Мы выбираем клиента на основе идентификационного номера. Я устанавливаю, что идентификационный номер имеет сеанс.Вот где я могу это сделать по адресу: '\t \t общественности статической строки СИФ \t \t { \t \t \t получить \t \t \t { \t \t \t \t если (HttpContext.Current.Session [ "СИФ"] == NULL) \t \t \t \t \t return ""; . \t \t \t \t еще \t \t \t \t \t возвращение HttpContext.Current.Session [ "СИФ"] ToString(); \t \t \t} \t \t \t множество {HttpContext.Current.Session [ "СИФ"] = значение; } \t \t} '- Тогда в представлении я вызываю MyClass.CIF, чтобы получить значение сеанса. – Turp

+0

@Turp - Зачем вам нужно добавлять клиента на сеанс? Почему бы просто не передать номер клиента в URL? Затем значение не сохраняется в сеансе, и оно исчезает, когда вам это больше не нужно. –

+0

У нас действительно нет реальной причины, за исключением того, что это было сделано передо мной в оригинальной версии веб-приложения. Вы имеете в виду что-то вроде '/ Customer/Edit/1234'? Мы обсуждали, что он не выглядит так хорошо, как '/ CustomerProfile/Edit', и еще одна вещь, которая была поднята, заключалась в том, что мы просто не хотели, чтобы наши пользователи заменяли текущее число случайным числом, чтобы подтянуть другой наших клиентов. BTY, это только внутреннее веб-приложение. Где вы стоите на этом? – Turp

3

Если это в одном контроллере, вы можете сделать это:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    base.OnActionExecuting(filterContext); 
    ... // do your magic 
} 

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

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } }); 

Но, очевидно, что следует перенаправить к действию в контроллере, который не зависит от переопределение, иначе у вас есть круговое перенаправление. :)