use*_*991 4 c# asp.net-mvc entity-framework asp.net-mvc-4
我已经创建了我的数据库的ADO.NET模型.使用CRUD(实体框架并使用我创建的ADO.NET实体模型)创建了一个新控制器.
在我的数据库中,我有一个简单的Users表.表中的密码行将包含使用SimpleCrypto(PBKDF2)加密的用户密码.
在我的ADO.NET Users.cs模型中,我添加了以下验证:
[Required]
[DataType(DataType.Password)]
[StringLength(20, MinimumLength = 6)]
[Display(Name = "Password")]
public string Password { get; set; }
Run Code Online (Sandbox Code Playgroud)
这与浏览器中的jQuery一起使用验证.但是在我的控制器中我正在加密密码,然后密码字符串将在长度上超过20个字符.
var crypto = new SimpleCrypto.PBKDF2();
var encryptedPass = crypto.Compute(user.Password);
user.Password = encryptedPass;
user.PasswordSalt = crypto.Salt;
_db.Users.Add(user);
_db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这给了我和"一个或多个实体的验证失败." - 错误.
我可以将用户复制到"var newUser",然后在那里设置所有属性,但是在这种情况下是否有更简单的方法绕过模型验证?
编辑:如果我删除模型中密码道具的验证,那么一切正常.因此,它是给我的错误,因为我改变从6-20个字符长度的密码,因为在控制器中的加密+100 lengt字符验证.
编辑:插入此问题的完整控制器部分.
[HttpPost]
public ActionResult Create(Users user)
{
if (!ModelState.IsValid)
{
return View();
}
if (_db.Users.FirstOrDefault(u => u.Email == user.Email) != null)
{
ModelState.AddModelError("", "User already exists in database!");
return View();
}
var crypto = new SimpleCrypto.PBKDF2();
var encryptedPass = crypto.Compute(user.Password);
user.Password = encryptedPass;
user.PasswordSalt = crypto.Salt;
_db.Users.Add(user);
_db.SaveChanges();
return RedirectToAction("Index", "User");
}
Run Code Online (Sandbox Code Playgroud)
这是ViewModels进入游戏的地方.您应该创建一个传递给视图的模型,然后将其映射回域模型.
ViewModel:
public class RegisterModel
{
[Required]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[StringLength(20, MinimumLength = 6)]
[Display(Name = "Password")]
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
域模型(您当前的User模型):
public class User
{
// other properties..
[Required]
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以在控制器中使用这些模型,如下所示:
该GET行动:
public ActionResult Register()
{
var registerModel = new RegisterModel();
return View(registerModel)
}
Run Code Online (Sandbox Code Playgroud)
有了这样的观点:
@model RegisterModel
@Html.LabelFor(model => model.UserName)
@Html.TextBoxFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
@Html.LabelFor(model => model.Password)
@Html.PasswordFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
Run Code Online (Sandbox Code Playgroud)
和POST行动:
[HttpPost]
public ActionResult Register(RegisterModel registerModel)
{
// Map RegisterModel to a User model.
var user = new User
{
UserName = registerModel.UserName,
Password = registerModel.Password // Do the hasing here for example.
};
db.Users.Add(user);
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)