将键入的数据从PageModel传递到布局页面

时间:2020-04-04 20:54:35

标签: c# asp.net-core razor-pages

我正在使用ASP.net核心Razor页面应用程序。 我有一个登录屏幕,我从数据库中获取了一些数据,并希望将其存储在ViewData中并将其传递给Layout页面,以便每个页面都将显示此数据。 问题是“登录”页面未使用“布局”页面。 对于使用“布局”页面的其他页面(例如Transaction.cshtml),我可以使用以下代码(“登录”页面除外)实现该目的

Transaction.cshtml.cs

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

_Layout.cshtml

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

我的问题是,如何从不使用_Layout页面的Login PageModel传递此ViewData到_Layout页面

1 个答案:

答案 0 :(得分:0)

好的,有很多方法可以做你想做的事。

我将向您展示一种方式:

首先,我创建了一个普通的AspNetCore Web应用程序,该应用程序使用单个用户帐户作为身份验证选项。

第二创建基础页面模型类,以在网站的私有部分(需要登录的页面)中重复使用所需的属性。

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()
        {

        }
    }
}

第五让我们将SecureStuff区域中的_ViewStart设置为使用新的_PrivateLayout,如下所示:

@{
    Layout = "_PrivateLayout";
}

第六:设置_PrivateLayout,将CustomBasePage设置为模型。

这一步至关重要!

这就是“跨页共享”的地方。所以这需要正确处理。

将此行代码添加为_PrivateLayout.cshtml文件中的第一行

@model CustomBasePage

最后在您的Startup类中,像这样注入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.cshtml

中使用这些属性

祝你好运!

这只是为了开始。但是您需要自己进行一些研究。