ASP.NET MVC: убедитесь, что у пользователя всегда установлена ​​переменная сеанса - PullRequest
7 голосов
/ 02 апреля 2010

Рассмотрим приложение ASP.NET MVC, для которого требуется установить переменную сеанса. Он используется во всем приложении. Это будет установлено либо путем чтения хэшированного значения в файле cookie браузера, либо после входа пользователя в систему.

В модели WebForms + Master Page я бы проверил Page_Load () главной страницы. Возможно, не главное событие, но его было легко найти.

Как бы вы проверили и применили существование переменной сеанса в ASP.NET MVC? Учтите, что этот вопрос может включать не данные для входа пользователя, а некоторые другие данные (возможно, при первом посещении).

Попытки решения

public void Application_BeginRequest(Object source, EventArgs e)
{
    HttpApplication application = (HttpApplication)source;
    HttpContext context = application.Context;

    context.Session["SomeDateTime"] =  DateTime.Now.ToString();

    // results in Object reference not set to an instance of an object.
    // context.Session is null
} 

Ответы [ 3 ]

10 голосов
/ 02 апреля 2010

У вас есть два варианта.

1. Поместите логику в функцию Initialize базового контроллера

Предполагая, что все ваши контроллеры наследуются от базового контроллера, вы можете поместить необходимую логику в переопределение функции Execute() базового контроллера.

public class BaseController : Controller
{
    public BaseController()
    {

    }

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
            // check if the user has the value here using the requestContext.HttpContext object
    }
{

2. Используйте функцию Global.asax void Application_PreRequestHandlerExecute(Object source, EventArgs e)

public void Application_PreRequestHandlerExecute(Object source, EventArgs e)
{
    HttpApplication application = (HttpApplication)source;
    HttpContext context = application.Context;

    // use an if statement to make sure the request is not for a static file (js/css/html etc.)
    if(context != null && context.Session != null)
    {
          // use context to work the session
    }
}

Примечание. Вторая часть работает с любым приложением ASP.NET, WebForms или MVC.

Что касается enforcing, что у них есть определенная переменная сеанса, она действительно очень открыта. Вы можете перенаправить на определенную страницу, чтобы они могли заполнить форму или выбрать опцию или что-то еще. Или может просто иметь значение по умолчанию, которое установлено для определенного ключа сеанса, если он не найден.

EDIT

Играя с этим, я заметил большую проблему с подходом Application_PreRequestHandlerExecute. Обработчик события вызывается для любого запроса, отправляемого на сервер, будь то файлы .css / .js / .html. Я не уверен, является ли это проблемой с настройкой моей рабочей станции или с тем, как работает ASP.NET/IIS, поэтому я хотел бы убедиться, что это не вызывается для всех запросов при реализации подхода, описанного выше.

По предыдущим причинам я завернул работу, которая должна быть выполнена в сеансе, с оператором if.

2 голосов
/ 02 апреля 2010

Не уверен, что я полностью понимаю вопрос, но я делаю это путем переопределения метода OnActionExecuting контроллера.

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

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
  if (filterContext.HttpContext.Session != null)
  {
       //TODO: Get value from session etc.
  }
  base.OnActionExecuting(filterContext);
}
0 голосов
/ 05 апреля 2010

В качестве другой альтернативы класс ControllerActionInvoker вызывает каждый метод действия; он назначается контроллеру через фабрику контроллеров. Таким образом, вы можете создать подкласс этого активатора действия, каждый раз, когда вызывается действие (путем переопределения метода InvokeAction), проверяйте здесь наличие ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...