我可以在没有模型绑定的情况下检查modelstate吗?

时间:2011-08-18 02:41:54

标签: c# asp.net-mvc entity-framework entity data-annotations

我正熟悉实体框架,我想知道是否有办法检查模型状态而不发生模型绑定。

假设我主要是从代码创建用户,在更新之前,有没有办法根据我预定义的数据注释检查以确保它是有效的?

    public ActionResult Index()
    {
        User u = new User();
        u.Username = "test";
        u.Password = "test";
        u.Email = "test";

        DefaultContext db = new DefaultContext();            

        if (ModelState.IsValid)
        {
            db.Users.Add(u);
            db.SaveChanges();
            Response.Write(u.Id);
        }
        else
            // model is not valid

        return View();
    }

上面的代码不起作用,因为没有绑定发生。或许我对这个过程感到困惑。

感谢。

2 个答案:

答案 0 :(得分:18)

ModelState将不可用,因为它是由模型绑定器设置的。 ModelBinder没有绑定模型,因此它没有运行验证,因此ModelState将为空。

但这并不能阻止您使用属性和执行验证。

假设您正在使用DataAnnotation属性,则可以在没有模型绑定的情况下运行验证。

鉴于此课程:

public class Widget
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public decimal Price { get; set; }
}

你可以这样做:

        var widget = new Widget
                        {
                            Id = 12,
                            Price = 15.57M
                        };

        var context = new ValidationContext(widget, null, null);
        var results = new List<ValidationResult>();
        if( Validator.TryValidateObject( widget, context, results, true ) )
        {
            //Validation Successful
        }
        else
        {
            //Validation Failed
        }

未设置Name属性,TryValidateObject()将失败。结果集合将发生实际错误。

答案 1 :(得分:10)

您可以使用TryValidateModelValidateModel

 User u = new User();
    u.Username = "test";
    u.Password = "test";
    u.Email = "test";


    if (TryValidateModel(u))
     {

     }else{

     }