(ASP.NET Core Razor Pages) Невозможно получить доступ к переменным сеанса с других страниц. - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь получить доступ к некоторым переменным сеанса в приложении Razor Pages, но сталкиваюсь с ошибками NullReferenceException.

В настоящее время я устанавливаю переменные в методе в модели, связанной со страницей «логин пользователя»:

public void StoreUserData(string username, string name, int accesslevel)
    {
        HttpContext.Session.SetString("username", username);
        HttpContext.Session.SetString("name", name);
        HttpContext.Session.SetInt32("accesslevel", accesslevel);
    }

Затем я вызываю этот метод (и метод, который получает данные для хранения), когда пользователь отправляет форму входа на странице (в сообщении):

public IActionResult OnPost()
    {
        (string username, string name, int accesslevel) = Login();
        StoreUserData(username, name, accesslevel);
        ViewData["username"] = HttpContext.Session.GetString("username");
        return Page();
    }

Я знаю, что переменные сеанса сохраняются и могут быть доступны (по крайней мере, на странице входа в систему), потому что строка "username" правильно отображается на странице с использованием ViewData, как показано в блоке выше.

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

Я хочу проверить переменные сеанса при загрузке страницы.Метод C # (часть модели страницы для второй страницы):

public (string username, string name, int accesslevel) GetUserData()
    {
        string username = HttpContext.Session.GetString("username");
        string name = HttpContext.Session.GetString("name");
        int accesslevel = Convert.ToInt32(HttpContext.Session.GetInt32("accesslevel"));

        return (username, name, accesslevel);
    }

И блок C # на html-странице для вызова этого метода (я не знаю лучшего способа сделать это при загрузке страницы):

@{ 
    Test_1Model model = new Test_1Model();
    (string username, string name, int accesslevel) = model.GetUserData();
    <div>@username</div>
}

В данный момент я просто хочу отобразить одну из переменных сеанса на этой второй странице, чтобы проверить, все ли работает.

Наконец, в файле startup.cs: Настройка служб:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(10);
        });

        services.AddHttpContextAccessor();

        services.AddMemoryCache();

        services.AddMvc();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);            
    }

Конфигурирование:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

Я знаю, что это много информации, но я старался быть максимально тщательным.Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 23 ноября 2018

Это вызвано тем, что Test_1Model model = new Test_1Model();, вы должны использовать Model вместо инициализации нового Test_1Model.Для этого нового объекта он не связан с вашим запросом, это просто объект.

Попробуйте.

@{
     ViewData["Title"] = "Contact";
     //ContactModel model = new ContactModel();
     (string username, string name, int accesslevel) = Model.GetUserData();
     <div>@username</div>
}
...