我正在尝试在 .net core 2.0 项目的 razor 视图中访问会话存储。 .net 2.0 视图中是否有 @Session["key"] 的等效项?我还没有找到如何执行此操作的有效示例 - 我使用我找到的方法收到此错误:
非静态字段、方法或属性 HttpContext.Session 需要对象引用
查看:
@using Microsoft.AspNetCore.Http
[HTML button that needs to be hidden/shown based on trigger]
@section scripts {
<script>
var filteredResults = '@HttpContext.Session.GetString("isFiltered")';
</script>
}
启动.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(30);
});
services.AddMvc();
// Added - uses IOptions<T> for your settings.
// Added - replacement for the configuration manager
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//exception handler stuff
//rewrite http to https
//authentication
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
您可以在 ASP.NET Core 2.0 中的视图中进行依赖注入:)
您应该将
IHttpContextAccessor
实现注入到您的视图中,并使用它从中获取 HttpContext
和 Session
对象。
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
<script>
var isFiltered = '@HttpContextAccessor.HttpContext.Session.GetString("isFiltered")';
alert(isFiltered);
</script>
假设您在
Startup.cs
类中有相关代码来启用会话,这应该可以工作。
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(s => s.IdleTimeout = TimeSpan.FromMinutes(30));
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
要在控制器中设置会话,您需要执行相同的操作。将
IHttpContextAccessor
注入您的控制器并使用它
public class HomeController : Controller
{
private readonly ISession session;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
this.session = httpContextAccessor.HttpContext.Session;
}
public IActionResult Index()
{
this.session.SetString("isFiltered","YES");
return Content("This action method set session variable value");
}
}
适当使用Session。如果您试图传递一些特定于当前页面的数据(例如:网格数据是否被过滤,这对于当前请求来说是非常特定的),那么您不应该使用会话。考虑使用视图模型并拥有可用于传递此数据的属性。您始终可以根据需要通过视图数据字典将这些值作为附加数据传递给部分视图。
记住,Http 是无状态的。当添加有状态行为时,请确保您这样做是出于正确的原因。
将其放在剃刀页面顶部
@using Microsoft.AspNetCore.Http;
然后你就可以轻松访问这样的会话变量
<h1>@Context.Session.GetString("MyAwesomeSessionValue")</h1>
如果您得到空值,请确保将其包含在 Startup.cs 中
& 确保选项。CheckConsentNeeded = 上下文设置为 false
有关 CheckConsentNeeded 的更多信息,请查看此 GDPR
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
//options.CheckConsentNeeded = context => true;
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set session timeout value
options.IdleTimeout = TimeSpan.FromSeconds(30);
options.Cookie.HttpOnly = true;
});
}
还要确保您在配置功能中将 app.UseSession(); 添加到您的应用程序管道
有关 Asp.net Core 中的会话的更多信息,请检查此链接 Asp.net Core 中的会话
在.net core 2.1上测试
正如其他人提到的,我认为真正的解决方案是根本不这样做。我想了一下,虽然我有充分的理由使用会话,但由于剃刀标签仅对初始页面加载有用,无论如何,使用存储的会话值填充控制器中的视图模型更有意义。
然后,您可以将具有当前会话值的视图模型传递到您的视图,并访问您的模型。那么你就不必在你的视图中注入任何东西。
下面的代码在 .net 6 中对我有用
在 Startup.cs 中
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromDays(1);
});
services.AddMvc().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSession();
}
在控制器中
[HttpPost]
public async Task<IActionResult> GetData([FromBody] IncomignRequest request)
{
if (request?.UserId != null)
{
HttpContext.Session.SetString("CurrentUser", request.UserId);
return Json(true);
}
else
return Json(false);
}
HTML 中
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
<script>
var user = @Json.Serialize(@HttpContextAccessor.HttpContext.Session.GetString("CurrentUser"))
</script>
用户:@Context.Session.GetString(“用户名”)