我设计了一个包含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
,根本无法转换..不是string
或int
。
那么如何在登录后填写user_id
?
答案 0 :(得分:1)
由于以下几个原因,这不起作用:
cmd.parameters.addwithvalue("user_id".httpcontext.current.user.identity");
Identity
这里是IIdentity
。这不会转换为int
。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;
}
}
现在,所有这些代码都不会只是放弃到您的解决方案中。但它可以很容易地修改。