扩展方法抛出错误

时间:2017-01-17 14:18:23

标签: c# asp.net asp.net-mvc extension-methods

我试图在我的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文件中使用了错误的扩展方法,还是缺少其他内容?

1 个答案:

答案 0 :(得分:2)

我认为您需要将视图中的代码更改为:

<span class="username">
    @{
        Project1.Models.User user = null;  
        if(Session.TryGetAuthenticatedValue(out user))
        {
            //Display username from Session object.
        }
    }
</span>

由于TryGetAuthenticatedValue方法返回bool,因此您不需要检查null,并且需要传入要检索的类型的变量而不是类型本身。

希望有所帮助!