我很确定我已经遵循了所有步骤,但似乎错过了一些东西。在MVC4应用程序中使用simplemembership。将Email添加到UserProfile表以及Register和UserProfile模型中,将其添加到Register方法,但仍然收到错误。这是一些代码:
型号:
public class UserProfile
{
public int UserId { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
}
public class RegisterModel
{
[Display(Name = "Email Address")]
[StringLength(20)]
// [Required]
public string Email { get; set; }
[Display(Name = "Date of Birth")]
// [Required]
public DateTime DOB { get; set; }
[Required]
[System.Web.Mvc.Remote("VerifyUserExists", "Account", ErrorMessage="That Username is already taken.")]
[Display(Name = "User name")]
public string UserName { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
控制器:
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email });
WebSecurity.Login(model.UserName, model.Password);
return RedirectToAction("Index", "Home");
}
catch (MembershipCreateUserException e)
{
ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
}
}
我不是想使用电子邮件地址作为登录信息,只是想在注册步骤中抓住它,以便我发送自动确认电子邮件。
我已尝试使用EF模型中包含的UserProfile表,并且使用它,没有区别。我已经确认数据库中的表有一个电子邮件列。
答案 0 :(得分:0)
如果您使用默认连接,请点击查看 - >打开数据库。然后,Server Explorer将展开DefaultConnection。在Tables下,您将看到UserProfile表。首先将列添加到表中并更新数据库,然后将额外的字段添加到类中。
答案 1 :(得分:0)
我猜你的Email属性(在你的UserProfile类中)是你在第一次执行应用程序后添加的东西,所以如果表已经存在,你改变了你的模型并添加了Email属性,它可能是例外的原因。
正如你在一条评论中提到的那样:
如果我从控制器中的Register方法中删除了新的{Email etc'部分,它会很好地传递
要解决这个问题,我认为您需要在DbContext派生类中执行类似的操作。(假设您使用代码优先方法):
public class myDbContext: DbContext
{
public myDbContext()
: base("DefaultConnection")
{
Database.SetInitializer<myDbContext>(new DropCreateDatabaseIfModelChanges<myDbContext>());
}
public DbSet<UserProfile> UserProfiles { get; set; }
}
默认设置为 CreateDatabaseIfNotExists ,因此如果您的UserProfile表已经存在,则它不会再创建它并且找不到您的新电子邮件属性(它在您的模型中但不在数据库表);