ASP.NET Core Razor调用Session扩展报CS0246类型找不到错误
Session存储对象列表在Razor视图中调用报错修复
报错根因说明
- 第一个方法组转换报错:Razor视图引擎解析规则要求,带泛型参数的C#方法调用如果要直接输出到页面,必须放在
@()显式代码块中,否则引擎会将方法名识别为待输出的方法组对象,不会执行方法调用,调整为@()包裹的写法是正确的。 - 第二个CS0246类型找不到报错,由两个问题共同导致:
- 命名空间引用错误:
SessionHelper扩展类定义在MMWeb.Helpers命名空间下,但视图中引用的是ConfigWeb.Helpers;同时UserRoleLevelDetails实体类属于TCS.ConfigDomainModel.UserManagement命名空间,视图中未引入该命名空间,编译器无法识别类型。 - 泛型调用逻辑不匹配:实现的
GetObjectFromJson<T>方法返回值是IList<T>,对应存储对象列表的场景,调用时要保证存、取的泛型类型完全一致。
- 命名空间引用错误:
具体修复步骤
- 修正视图顶部的命名空间引用,替换错误的Helper命名空间、补充实体类命名空间:
@inject IHttpContextAccessor HttpContextAccessor; @using Microsoft.Extensions.Configuration @inject IConfiguration Configuration @model IEnumerable<TCS.ConfigDomainModel.UserManagement.UserRoleLevelDetails> @using MMWeb.Helpers @using TCS.ConfigDomainModel.UserManagement
- 调整Session取值的调用逻辑,建议在Razor代码块中先取值赋值给变量,后续直接调用变量即可,避免重复写长链路调用:
@{ // 取Session中存储的UserRoleLevelDetails列表 var userRoleLevelList = HttpContextAccessor.HttpContext.Session.GetObjectFromJson<UserRoleLevelDetails>("GetAllUsersList"); }
如果需要直接输出取值结果,保留@()包裹的写法即可:
@(HttpContextAccessor.HttpContext.Session.GetObjectFromJson<UserRoleLevelDetails>("GetAllUsersList"))
- 可选优化:给Session扩展类补充单对象存取的重载方法,兼容单个对象、对象列表两种存储场景,避免后续混用出现类型错误:
using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System.Collections.Generic; namespace MMWeb.Helpers { public static class SessionHelper { public static void SetObjectAsJson(this ISession session, string key, object value) { session.SetString(key, JsonConvert.SerializeObject(value)); } // 列表读取方法(原有逻辑,重命名更易区分) public static IList<T> GetObjectListFromJson<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(IList<T>) : JsonConvert.DeserializeObject<IList<T>>(value); } // 补充单对象读取重载 public static T GetObjectFromJson<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value); } } }
注意:如果调整了扩展方法名,视图中调用时对应替换为新的方法名即可,比如取列表就调用GetObjectListFromJson<UserRoleLevelDetails>,取单个对象就调用GetObjectFromJson<UserRoleLevelDetails>。
内容的提问来源于stack exchange,提问作者user18243370
相关产品推荐
相关产品推荐

