[英]ASP.Net Identity .FindIdAsync not finding user?
我仍在努力嘗試使Identity 2正常運行的示例應用程序。 在以下文章中,我獲得了將角色信息添加到ViewModel來顯示用戶的幫助。 需要了解如何獲取/顯示用戶角色
現在,我試圖解決單擊用戶的“編輯”按鈕時遇到的問題。 當我嘗試使用.FindIdAsync方法查找控制器時,控制器會不斷為用戶顯示NULL。 但是,在調試模式下,我可以看到將正確的ID傳遞到Edit ActionResult中。
我在索引視圖中使用ViewModel的事實與此有關嗎? 我本以為,由於正確傳遞了ID,因此此時的ViewModel超出了圖片范圍。
我已經在網上搜索過,但是找不到任何可以幫助我解決問題的信息。
這是ActionResult,在調試中,我可以看到ID填充了正確的值。 因此,我不知道為什么找不到記錄。 沒有錯誤消息,它只是為用戶對象返回NULL,該對象在表中的每個用戶上顯示“ User Not Found”錯誤。
我希望有人可以幫助我指出一些可以幫助我弄清楚這一點的東西。
public async Task<ActionResult> Edit(string id)
{
AppUser user = await UserManager.FindByIdAsync(id);
if (user != null)
{
return View(user);
}
else
{
return View("Error", new string[] { "User Not Found" });
}
}
public class AppUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
這是我在索引視圖上使用的ViewModel,我認為與該問題沒有任何關系,但以防萬一。
public class UserEditVM : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserRole { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
}
這是我的AppUserManager
public class AppUserManager : UserManager<AppUser>
{
public AppUserManager(IUserStore<AppUser> store)
: base(store)
{
}
public static AppUserManager Create(
IdentityFactoryOptions<AppUserManager> options,
IOwinContext context)
{
AppIdentityDbContext db = context.Get<AppIdentityDbContext>();
AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db));
manager.PasswordValidator = new CustomPasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = true,
RequireUppercase = true
};
manager.UserValidator = new CustomUserValidator(manager)
{
AllowOnlyAlphanumericUserNames = true,
RequireUniqueEmail = true
};
return manager;
}
}
更新:這是我更新的ViewModel。 刪除繼承,並從IdentityUser添加了我需要的屬性。
public class UserEditVM
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string UserRole { get; set; }
public IEnumerable<AppRole> AllRoles { get; set; }
}
我猜想,如果您僅使用現有的身份模型並實現如下所示的類,該類繼承IUserStore<User>, IUserLoginStore<User>
類的接口IUserStore<User>, IUserLoginStore<User>
您也許可以自行處理任何異步方法。
示例:請參見下面的代碼,此代碼使用dapper ,因此您可以使用自己的ORM:
public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>, IUserRoleStore<User>
{
private readonly string connectionString;
public UserStore()
{
this.connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
}
/// <summary>
/// Returns User tables information, based on parameter type userId/Username will be equated in where condition
/// </summary>
/// <param name="userId">userId or Username can be passed</param>
/// <returns></returns>
public virtual Task<User> FindByIdAsync(string userId)
{
if (string.IsNullOrWhiteSpace(userId.ToString()))
throw new ArgumentNullException("userId", string.Format("'{0}' is not a valid format.", new { userId }));
return Task.Factory.StartNew(() =>
{
var parameters = new DynamicParameters();
parameters.Add("@userId", userId);
using (SqlConnection connection = new SqlConnection(connectionString))
return connection.Query<User>("spUsers_GetUser", parameters, commandType: CommandType.StoredProcedure).SingleOrDefault();
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.