2013-10-31 69 views
0

我設計了一個數據庫,其列user_id。現在在登錄後我的表單頁面中,當我點擊一個插入按鈕時,我需要填寫user_id,其值爲HttpContext.Current.User.Identity.NameHttpContext.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

那麼登錄後如何在db中填寫user_id

+3

'HttpContext.Current.User.Identity.Name'是你的用戶名 - 例如'蘇珊' - 你想如何將其轉換爲'int'? –

回答

1

這不會有幾個原因的工作:

cmd.parameters.addwithvalue("user_id".httpcontext.current.user.identity"); 
  1. 它不會編譯 - 注:請包括在以後的例子編譯代碼。
  2. Identity這裏是一個IIdentity。這不會轉換爲int
  3. 用戶ID是不存儲,也不可用,關閉IPrincipal

您需要通過往返數據庫來恢復用戶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; 
    } 
} 

現在,所有這些代碼不會只是下降到您的解決方案。但它可以很容易地修改。

相關問題