ASP.NET Core MVC 6中jQuery的$(document).ready读取Session值失败求助
问题描述
我正在开发一个ASP.NET Core MVC 6应用,在控制器中通过如下代码设置Session变量:
HttpContext.Session.SetString("PrimaryNavigation", "First");
我需要在_Layout.cshtml中获取该值,于是编写了如下代码:
<script language="javascript" type="text/javascript"> $(document).ready(function () { alert('<%= Session("PrimaryNavigation")%>'); }); </script>
但弹出的alert显示的是'<%= Session("PrimaryNavigation")%>'而非对应的Session值。此前在其他使用JavaScript的应用中该方式可行,但在jQuery与ASP.NET Core的组合中却无法生效,请问我遗漏了什么?
解决方法
你用的是ASP.NET Web Forms的语法<%= %>,但ASP.NET Core MVC采用的是Razor语法,两者不兼容。要在Razor视图(包括_Layout.cshtml)中获取Session值,需要改用Razor的写法:
方式一:直接在脚本中嵌入Razor表达式
把原来的<%= Session("PrimaryNavigation")%>替换为@Context.Session.GetString("PrimaryNavigation"),代码修改如下:
<script type="text/javascript"> $(document).ready(function () { alert('@Context.Session.GetString("PrimaryNavigation")'); }); </script>
注意:如果Session值可能包含单引号,直接拼接会触发JS语法错误,建议用Json.Serialize做转义处理:
<script type="text/javascript"> $(document).ready(function () { var navValue = @Json.Serialize(Context.Session.GetString("PrimaryNavigation")); alert(navValue); }); </script>
方式二:通过HTML元素属性中转读取
如果不想在脚本里直接写Razor代码,可以先把Session值存入页面元素的data-*属性,再用JS读取:
<div id="navData" data-nav-value="@Context.Session.GetString("PrimaryNavigation")"></div> <script type="text/javascript"> $(document).ready(function () { var navValue = $('#navData').data('nav-value'); alert(navValue); }); </script>
另外要确认你已在ASP.NET Core中正确配置Session服务:
- 在
Program.cs中添加Session服务:
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
- 在中间件管道中启用Session(需放在
app.UseRouting()之后、app.UseAuthorization()之前):
app.UseSession();
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

