扩展方法抛出错误
Extension method throwing error
我正在尝试在我的 asp.net MVC 5 项目中实现强类型会话变量。我发现 this SO article 是我的基础,但由于我缺乏扩展知识,所以有一些我不熟悉的错误。
这是 SessionExtensions
class:
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);
这一切都很好。我遇到的 issue/error 是当我尝试从会话中检索 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
class 是由 EF 自动生成的。
我在 .cshtml 文件中使用的扩展方法有误还是缺少其他内容?
我认为您需要将视图中的代码更改为:
<span class="username">
@{
Project1.Models.User user = null;
if(Session.TryGetAuthenticatedValue(out user))
{
//Display username from Session object.
}
}
</span>
由于方法 TryGetAuthenticatedValue returns 是 bool,因此您无需检查是否为 null,并且您需要传入要检索的类型的变量,而不是类型本身。
希望对您有所帮助!
我正在尝试在我的 asp.net MVC 5 项目中实现强类型会话变量。我发现 this SO article 是我的基础,但由于我缺乏扩展知识,所以有一些我不熟悉的错误。
这是 SessionExtensions
class:
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);
这一切都很好。我遇到的 issue/error 是当我尝试从会话中检索 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
class 是由 EF 自动生成的。
我在 .cshtml 文件中使用的扩展方法有误还是缺少其他内容?
我认为您需要将视图中的代码更改为:
<span class="username">
@{
Project1.Models.User user = null;
if(Session.TryGetAuthenticatedValue(out user))
{
//Display username from Session object.
}
}
</span>
由于方法 TryGetAuthenticatedValue returns 是 bool,因此您无需检查是否为 null,并且您需要传入要检索的类型的变量,而不是类型本身。
希望对您有所帮助!