Передать типизированные данные из PageModel в Layout Page - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю с приложением ASP. net core Razor pages. У меня есть экран входа в систему, на котором я получаю некоторые данные из базы данных и хочу сохранить их в ViewData и передать их на страницу макета, чтобы на каждой странице отображались эти данные. Проблема в том, что страница входа не использует страницу макета. Для других страниц, таких как Transaction.cs html, которые используют страницу макета, я могу добиться этого, используя приведенный ниже код, за исключением страницы входа в систему

Transaction.cs html .cs

ViewData["AccountBalance"] = accbal.ToString();

_Layout.cs html

<p>Your Account Balance : @ViewData["AccountBalance"]</p>

Мой вопрос: как передать эти ViewData из модели входа в систему, которая не использует страницу _Layout, на страницу _Layout

1 Ответ

0 голосов
/ 05 апреля 2020

ОК, есть много способов сделать то, что вы хотите.

Я собираюсь показать вам один способ:

Первый Я создал ванильное веб-приложение AspNetCore, которое использует индивидуальные учетные записи пользователей для параметров аутентификации.

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

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace RazorPagesExample
{
    //this class will be inherited by all your pages that are private
    [Authorize]//this makes it so that you need to log in
    public class CustomBasePage : PageModel //inherit from PageModel
    {
        //this is a custom property shared with all the pages that inherit this class
        public string Email { get; set; }

        //here add more custom properties to share across your website

        //added the HttpContextAccessor to get the username in the constructor
        public CustomBasePage(IHttpContextAccessor httpContext) 
        {
            //set the custom properties
            Email = httpContext.HttpContext.User.Identity.Name;
            //now that you have the user name you can go to the database
            //and set more custom properties.
        }
    }
}

Третий Я добавил область SecureStuff на свой сайт следующим образом:

enter image description here

Обратите внимание, как в моей папке SecureStuff / Pages я добавил _PrivateLayout, который будет использоваться всеми «Защищенными страницами» в Районе.

Четвертый давайте установим страницу индекса внутри Области SecureStuff для наследования нашего нового базового класса, например:

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace RazorPagesExample.Areas.SecureStuff.Pages
{
    //notice how we inherit our CustomBasePage
    public class IndexModel : CustomBasePage
    {
        private readonly ILogger<IndexModel> _logger;

        //notice how we pass the IHttpContextAccessor to the base class by calling the
        //base constructor
        public IndexModel(ILogger<IndexModel> logger, IHttpContextAccessor httpContext) :base(httpContext)
        {
            _logger = logger;
        }

        public void OnGet()
        {

        }
    }
}

Пятый Давайте установим _ViewStart внутри моей Области SecureStuff для использования нового _PrivateLayout следующим образом:

@{
    Layout = "_PrivateLayout";
}

Шестой Установите _PrivateLayout установить CustomBasePage в качестве модели.

Этот шаг очень важен!

Именно здесь произойдет «обмен между страницами». Так что это нужно сделать правильно.

Добавьте эту строку кода как FIRST LINE в файле _PrivateLayout.cs html:

@model CustomBasePage

Наконец В вашем классе запуска Введите HttpContextAccessor следующим образом:

        public void ConfigureServices(IServiceCollection services)
        {
            //all the stuff here was omitted for brevity
            ......

            //add your razor pages functionality
            services.AddRazorPages();

            //this is is needed to access the user from within the constructor of the base class
            //must be added after the Razor Pages stuff
            services.AddHttpContextAccessor();
        }

И вот результат:

enter image description here

Ура !!

Теперь вы можете делиться свойствами со многими страницами в вашей защищенной области. И используйте эти свойства внутри своего _SecureLayout.cs html

Удачи!

Это только для начала. Но вам нужно провести собственное исследование.

...