我仍在努力尝试使用Identity 2工作的示例应用。在以下文章中,我获得了帮助向ViewModel添加角色信息以显示我的用户。 Need understanding on how to get/display User Role
现在我正在尝试解决当我点击用户的“编辑”按钮时遇到的问题。当我尝试使用.FindIdAsync方法找到它时,我的控制器一直为用户提供NULL。但是,在调试模式下,我可以看到正确的ID传递给Edit ActionResult。
我在索引视图中使用ViewModel的事实是否与它有关?我原本以为,由于正确传递了ID,因此ViewModel在那时就不在了。
我在网上搜索过但找不到任何可以帮我解决问题的内容。
这是ActionResult,在调试中我可以看到id正在填充正确的值。所以,我不知道为什么它没有找到记录。没有错误消息,它只是为显示" User Not Found"的用户对象返回NULL。我桌子上的每个用户都有错误。
我希望有人可以帮助指出我可以看到的东西,以帮助解决这个问题。
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; }
}
答案 0 :(得分:1)
我想,如果你只是使用现有的身份模型并实现一个像下面这样继承像IUserStore<User>, IUserLoginStore<User>
这样的接口的类你可能能够自己处理任何异步方法。
示例:请参阅下面的代码,btw此代码使用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();
});
}
}