我正在使用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页面
答案 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区域,如下所示:
请注意,如何在我的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();
}
这是结果:
万岁!
现在,您可以在“安全资料区”中的多个页面之间共享属性。 并在_SecureLayout.cshtml
中使用这些属性祝你好运!
这只是为了开始。但是您需要自己进行一些研究。