绕过控制器中的模型验证?

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)

Hen*_*ema 8

这是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)