我正在进行身份验证,成功登录后,我想在导航栏上显示用户名。我使用静态字段来保存用户名并使用
@ViewBag
显示它,问题是当路线更改时 viewbag 变为空。这需要我在每个操作中使用静态字段更新 viewbag。那么有没有其他方法可以做到这一点,而无需在每个操作中更新 viewbag?任何避免代码重复的方法都将受到赞赏。
控制器:仪表板
public async Task<IActionResult> Index()
{
// Get session
string id = httpContextAccessor.HttpContext.Session.GetString("AccoountId");
// Find user | loggedin user
var account = await userService.GetAccount(id);
Profile.Firstname = account.Firstname;
Profile.Lastname = account.Lastname;
ViewBag.Name = $"{Profile.Firstname.ToString().Substring(0, 1)}.{Profile.Lastname}";
var report = userService.GetReportAsync().Result;
if (report == null)
return RedirectToAction("UnAuthorize", "Home");
return View(report);
}
视图:_布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - Contact Manager Portal</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$(document).ready(function () {
$("#openModalBtn").click(function () {
$("#myModal").modal('show');
});
});
</script>
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
@*<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ContactsManager.Web</a>*@
<div>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Reports</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="User" asp-action="Index">Clients</a>
</li>
</ul>
</div>
</div>
<div style="gap:.9em; display:flex">
@using (Html.BeginForm("Search", "User", FormMethod.Get))
{
<div class="input-group mb-6 d-flex" style="gap:.6em">
<input type="text" class="form-control" name="query" placeholder="Search Contacts">
<button type="submit" class="btn btn-outline-secondary">Search</button>
</div>
}
<button id="openModalBtn" type="button" class="btn btn-outline-primary">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-cloud-plus" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 5.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V10a.5.5 0 0 1-1 0V8.5H6a.5.5 0 0 1 0-1h1.5V6a.5.5 0 0 1 .5-.5" />
<path d="M4.406 3.342A5.53 5.53 0 0 1 8 2c2.69 0 4.923 2 5.166 4.579C14.758 6.804 16 8.137 16 9.773 16 11.569 14.502 13 12.687 13H3.781C1.708 13 0 11.366 0 9.318c0-1.763 1.266-3.223 2.942-3.593.143-.863.698-1.723 1.464-2.383m.653.757c-.757.653-1.153 1.44-1.153 2.056v.448l-.445.049C2.064 6.805 1 7.952 1 9.318 1 10.785 2.23 12 3.781 12h8.906C13.98 12 15 10.988 15 9.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 4.825 10.328 3 8 3a4.53 4.53 0 0 0-2.941 1.1z" />
</svg>
Upload
</button>
</div>
<div>
<p style="margin:0px">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person" viewBox="0 0 16 16">
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6m2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0m4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4m-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10s-3.516.68-4.168 1.332c-.678.678-.83 1.418-.832 1.664z" />
</svg>
@ViewBag.Name
</p>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container" style="text-align:center; font-size:.9rem">
©Copyright Reserved @DateTime.Now.Year | Contact Manager | <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
我使用静态字段来保存用户名并显示它 使用@ViewBag,问题是当路线改变时viewbag变成 空。
嗯,你是对的,你得到的结果是预期的。因为,ViewBag、TempData、ViewData 都是非持久数据,意味着一旦加载视图,下次数据将不再可用。因此,一旦您切换页面或更改路线,这不会将您的登录用户名保留在布局页面中。
那么有没有其他方法可以在不更新每个视图包的情况下做到这一点? 行动?
直接回答你的问题,是的。事实上,处理这个问题的方法有很多。但对于您的场景来说,最方便的是使用 asp.net core session。
在 .NET 会话中,我们有 SetString(ISession, String, String) 和 GetString() 可以保留您的个人资料名称,您可以设置要保留数据的持续时间,最重要的是,它的持久的,无论您更改路线、页面或任何内容,它都会保留该值而无需重新加载或任何内容。
让我们在实践中看看如何在您的场景中使用它:
控制器:
在您的控制器中,您可以执行以下操作:
public async Task<IActionResult> Index()
{
var firstName = "Tipe";
var LastName = "Farid Uddin";
HttpContext.Session.SetString("UserName", $"{firstName} {LastName}");
return View();
}
布局:
为了访问布局页面中的名称,首先在布局页面的最顶部包含此行:
@inject IHttpContextAccessor httpContextAccessor
现在更新您的布局页面,如下所示:
<div>
<p style="margin:0px">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person" viewBox="0 0 16 16">
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6m2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0m4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4m-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10s-3.516.68-4.168 1.332c-.678.678-.83 1.418-.832 1.664z" />
</svg>
@(httpContextAccessor.HttpContext.Session.GetString("UserName") ?? "")
</p>
</div>
程序.cs:
在您的program.cs文件中,您应该注册会话中间件参考,如下所示:
builder.Services.AddHttpContextAccessor();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(2);
});
并使用会话:
app.UseSession();
输出:
注意: 您可以根据您的要求自定义会话选项。正如之前告诉您的,有几种方法可以实现您想要实现的目标。另外,如果你想了解更多,请参考这个官方文档。