我正在写一个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/Index
或https://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();
}