_layout.cshtml在/Home/Index中看不到对象



我正在写一个ASP。. NET Core 6 MVC应用。

我有一个类型为UserInfo的对象,它被设置(在哪里不重要)。在Shared下,我的_Layout.cshtml显示"登录id";在菜单栏的顶部

显示此用户名的部分位于_LogInOutPartial.cshtml中在局部视图中,我检查UserInfo对象并相应地设置变量displayUser:如果用户对象为空,我将变量设置为"Guest",否则我将登录id拉入该变量。

_LogInOutPartial中的代码。cshtml是:

@model SisExtMvcAppSSO.Models.UserInfo;
@{
bool isGuest = (Model == null || !Model.IsLogged);
bool isLoggedIn = !isGuest;
string displayUser = (isGuest ? "Guest" : Model.LoginId);
}
<button class="btn btn-outline-success my-2 my-sm-0">
<i class="bi bi-person-badge"></i> @displayUser
</button>

当对象被设置,如果我去到一些控制器/动作,例如https://some.com/myApp/Home/Claims,登录id显示良好(例如"mcollins")在顶部菜单栏

然而,如果我去https://some.com/myApp/(或https://some.com/myApp/Home/Indexhttps://some.com/myApp/Home),菜单栏(_layout.cshtml)不会显示登录id,而是显示"Guest">

即使/Home/Index将在其视图中显示登录id !显然,问题是,在_Layout.cshtml中没有看到这个对象。

但是,当我去/Home/Claims时,它是如何在菜单栏(_Layout.cshtml)中看到的呢?

通常我们将UserManager作为Identity的_LogInOutPartial.cshtml中的模型。如果您不想使用它,您可以尝试使用Session并在某处将对象添加到Session中。一旦添加了数据,您就可以在其他视图中获得它。

Program.cs:

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromDays(1);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});

...
app.UseAuthorization();
app.UseSession();
...

部分观点:

@using Microsoft.AspNetCore.Http;
@using Newtonsoft.Json;

@{
UserInfo userInfo=null;
if (!string.IsNullOrEmpty(Context.Session.GetString("userInfo")))
{
userInfo = JsonConvert.DeserializeObject<UserInfo>(Context.Session.GetString("userInfo"));
}

bool isGuest = (userInfo == null || !userInfo.IsLogged);
bool isLoggedIn = !isGuest;
string displayUser = (isGuest ? "Guest" : userInfo.LoginId);
}
<button class="btn btn-outline-success my-2 my-sm-0">
<i class="bi bi-person-badge"></i> @displayUser
</button>

行动:

public IActionResult YourAction()
{
UserInfo userInfo = new UserInfo { LoginId = "mcollins", IsLogged = true };
HttpContext.Session.SetString("userInfo", JsonConvert.SerializeObject(userInfo));
return View();
}

最新更新