自定义模型绑定后验证视图模型

2023-12-15

我有一个实现的视图模型IValidatableObject包含一个字符串和另一个视图模型的集合,如下所示:

public sealed class MainViewModel
{
    public string Name { get; set; }
    public ICollection<OtherViewModel> Others { get; set; }
}

我的验证检查每个对象Others使用提供的合同反对不同的规则IValidatableObject:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    foreach (var other in this.Others)
    {
        // validate or yield return new ValidationResult
    }
}

由于实际结构复杂MainViewModel我必须创建一个自定义模型绑定器,它重新构建模型并将 POST 数据分配给相关组件。我遇到的问题是,没有任何内容得到验证,导致上下文级别的验证错误,因为它违反了某些数据库约束,而且我不确定我做错了什么 - 我假设ModelState.IsValid会调用Validate方法在我的视图模型上,但它似乎并没有那样走下去。

我的模型活页夹看起来像这样:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    int modelId = (int)controllerContext.RouteData.Values["id"];

    // query the database and re-build the components of the view model

    // iterate the POST data and assign to the model where necessary

    // should I be calling something here to validate the model before it's passed to the controller?

    return model;
}

任何帮助表示赞赏!

Validator.TryValidateObject

好吧,看来我更接近了。我现在可以得到我的IValidatableObject通过将以下内容添加到我的自定义模型绑定器来运行的方法:

var validationResults = new HashSet<ValidationResult>();
var isValid = Validator.TryValidateObject(model, new ValidationContext(model, null, null), validationResults, true);

看来Validator.TryValidateObject调用验证方法并将最后一个参数设置为true使其验证所有属性。但是,我现在坚持要获得validationResults到控制器,以便可以以有意义的方式使用它们。


我应该意识到我可以使用ModelState.AddModelError通过自定义活页夹,我现在通过在将模型返回到控制器之前将以下内容添加到我的自定义模型活页夹中,成功地使其正常工作:

var validationResults = new HashSet<ValidationResult>();
var isValid = Validator.TryValidateObject(model, new ValidationContext(model, null, null), validationResults, true);
if (!isValid)
{
    foreach (var result in validationResults)
    {
        bindingContext.ModelState.AddModelError("", result.ErrorMessage);
    }
}

return model;

现在,这将向我的页面返回所有错误的列表,并且ModelState.IsValid检查我的控制器操作现在正在返回false.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义模型绑定后验证视图模型 的相关文章

随机推荐