无法转换HttpContext.Current.User.Identity.Name

时间:2013-10-31 08:43:46

标签: c# sql-server asp.net-mvc

我设计了一个包含user_id列的数据库。现在,在我点击插入按钮后登录后的表单页面中,我需要填充user_id,其值为HttpContext.Current.User.Identity.Name

但是它显示了一个错误。我转换为int.parse或字符串或我只是使用HttpContext.Current.User.Identity仍然错误。任何人都可以帮助我吗?

例如

cmd.Parameters.AddWithValue("user_id", HttpContext.Current.User.Identity);

我应该补充一点,我的user_id列是SQL Server 2008中的数据类型int

它说我是IConvertible,根本无法转换..不是stringint

那么如何在登录后填写user_id

1 个答案:

答案 0 :(得分:1)

由于以下几个原因,这不起作用:

cmd.parameters.addwithvalue("user_id".httpcontext.current.user.identity");
  1. 它不会编译 - 注意:请在将来的示例中包含可编译的代码。
  2. Identity这里是IIdentity。这不会转换为int
  3. 用户ID 未存储也不可用,不在IPrincipal
  4. 您需要通过往返数据库来恢复用户ID。唯一可用的是HttpContext.Current.User.Identity.Name


    现在,我过去所做的就是为我的UserProfile模型添加一个方法,你知道,当你调用这个模型时,你正在利用这个方法来实际创建一个用户记录:

    WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
        new
        {
            // additional profile fields are passed as an anonymous type
            CustomField1 = model.CustomField1
        });
    

    这是UserProfile方法:

    public static int? PrincipalUserId(IPrincipal user)
    {
        if (!user.Identity.IsAuthenticated)
        {
            return null;
        }
    
        var key = string.Format("userid_{0}", user.Identity.Name);
    
        int userId;
        if (!SharedCacheManager.TryGetValue<int>(key, out userId))
        {
            using (UsersContext udb = new UsersContext())
            {
                userId = udb.UserProfiles
                    .Where(up => up.UserName == user.Identity.Name)
                    .First().UserId;
            }
    
            SharedCacheManager.SetValue<int>(key, userId);
        }
    
        return userId;
    }
    

    这是SharedCacheManager

    public static class SharedCacheManager
    {
        public static bool TryGetValue<T>(string key, out T result)
        {
            var cache = HttpContext.Current.Cache;
    
            object o = cache[key];
            if (o == null)
            {
                result = default(T);
                return false;
            }
            else if (o.GetType() != typeof(T))
            {
                result = default(T);
                return false;
            }
    
            result = (T)o;
            return true;
        }
    
        public static void SetValue<T>(string key, T val)
        {
            var cache = HttpContext.Current.Cache;
            cache[key] = val;
        }
    }
    

    现在,所有这些代码都不会只是放弃到您的解决方案中。但它可以很容易地修改。