扩展方法抛出错误

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,并且您需要传入要检索的类型的变量,而不是类型本身。

希望对您有所帮助!