我试图在我的asp.net MVC 5项目中实现强类型会话变量。我找到了this SO article,但是由于我对扩展的了解不足,我有一些我不熟悉的错误。
这是SessionExtensions
班级:
public static class SessionExtensions
{
public static bool TryGetValue<T>(this HttpSessionStateBase session, out T value)
where T : class
{
var name = typeof(T).FullName;
value = session[name] as T;
var result = value != null;
return result;
}
public static void SetValue<T>(this HttpSessionStateBase session, T value)
{
var name = typeof(T).FullName;
session[name] = value;
}
public static void RemoveValue<T>(this HttpSessionStateBase session)
{
var name = typeof(T).FullName;
session[name] = null;
}
public static bool ValueExists(this HttpSessionStateBase session, Type objectType)
{
var name = objectType.FullName;
var result = session[name] != null;
return result;
}
public static bool TryGetAuthenticatedValue<T>(this HttpSessionStateBase session,
out T value)
where T : class
{
value = null;
if (HttpContext.Current.User != null
&& HttpContext.Current.User.Identity != null
&& HttpContext.Current.User.Identity.IsAuthenticated)
{
var name = typeof(T).FullName;
value = session[name] as T;
}
var result = value != null;
return result;
}
}
可以在代码隐藏中轻松分配整个对象:
DBRepository repo = new DBRepository();
var user = repo.GetAppUserInformation(userId);
Session.SetValue(user);
这一切都很有效。我遇到的问题是我尝试从会话中检索User
对象。我看到TryGetAuthenticatedValue
扩展方法但是当我尝试在我的.cshtml中使用它时,我收到错误。
<span class="username">
@{
if(Session.TryGetAuthenticatedValue(Project1.Models.User) != null)
{
//Display username from Session object.
}
}
</span>
错误发生在Project1.Models.User
的设计时,并指出'User' is a type, which is not valid in the given context.'
值得注意的是,我使用的是EF 6,而User
类是由EF自动生成的。
我在.cshtml文件中使用了错误的扩展方法,还是缺少其他内容?
答案 0 :(得分:2)
我认为您需要将视图中的代码更改为:
<span class="username">
@{
Project1.Models.User user = null;
if(Session.TryGetAuthenticatedValue(out user))
{
//Display username from Session object.
}
}
</span>
由于TryGetAuthenticatedValue方法返回bool,因此您不需要检查null,并且需要传入要检索的类型的变量而不是类型本身。
希望有所帮助!