是否可以手动更新ModelState.IsValid?(Is it possible to upda

2019-07-29 02:53发布

我想用内置的验证尽可能功能。 我也想用同样的模型CRUD方法。

然而,作为一个下拉列表中不能使用标准的模式来完成,我必须手动验证。 在后背法,我想只是验证下拉列表,这个结果添加到ModelState中,这样我就不必验证所有与数据注解来实现其他参数。 是否有可能实现这一目标?

我可能是弄错了下拉列表中,但是从我读,一个下拉列表中HTML对象的名称不能相同,在模型中的属性,以便正确设置选择的值。 是否仍然可以使用数据标注与此解决方法吗?

谢谢。

Answer 1:

您可以使用addModelError

ModelState.AddModelError(key,message)

当您使用,它将无效的ModelState这样isValid将返回false。


更新
看到注释@彼得的回答后,

如果你想从影响排除元素isValid()结果,你可以使用ModelState.Remove(field)之前调用方法isValid()



Answer 2:

另一种选择是继承IValidatableObject在你的模型。 实现它的Validate方法,你可以留在原地其他所有验证和写你在这个方法想要的任何代码。 注意:您返回一个空IEnumerable<ValidationResult>表示没有任何错误。

public class Class1 : IValidatableObject
{
    public int val1 { get; set; }
    public int val2 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var errors = new List<ValidationResult>();
        if (val1 < 0)
        {
            errors.Add(new ValidationResult("val1 can't be negative", new List<string> { "val2" }));
        }
        if (val2 < 0)
        {
            errors.Add(new ValidationResult("val2 can't be negative", new List<string> { "val2" }));
        }
        return errors;
    }
}

编辑:在重新阅读的问题后,我不认为这适用于这种情况,但我离开这里的答案的情况下,它可以帮助别人。



Answer 3:

你不能手动设置ModelState.IsValid财产,但你可以到ModelState中,这将确保该IsValid的是假的添加消息。

ModelState.AddModelError();


Answer 4:

是的,你可以做到这一点(也将用于CRUD方法同型号):

示例模型

public class User 
{
    public virtual int Id{ get; set; }
    public virtual Role Role { get; set; }
}
public class Role 
{        
    [Required(ErrorMessage = "Id Required.")]
    public virtual int Id { get; set; }
    [Required(ErrorMessage = "Name Required.")]
    public virtual string Name { get; set; }
}

实施例视图,在下拉列表的验证

@Html.DropDownListFor(m => m.Role.Id, (SelectList)ViewBag.gRoles, "-- Select --")
@Html.ValidationMessageFor(m => m.Role.Id)

控制器:清除所需的(但这里并不需要)领域

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Creedit(User x)
{
    x.Role = db.RoseSet.Find(x.Role.Id);
    if (x.Role != null)
    {
        ModelState["Role.Name"].Errors.Clear();

    }

    if (ModelState.IsValid)
    {
      // proceed
    }
    else
    {
      // return validation error
    }
}


文章来源: Is it possible to update ModelState.IsValid manually?