gpt4 book ai didi

asp.net-mvc-3 - 在自定义模型绑定(bind)后验证 View 模型

转载 作者:行者123 更新时间:2023-12-04 07:30:20 25 4
gpt4 key购买 nike

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

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

我的验证使用 IValidatableObject 提供的契约(Contract)根据不同的规则检查 Others 中的每个对象:

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

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

我的模型 Binder 如下所示:

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 发送到 Controller ,以便以有意义的方式使用它们。

最佳答案

我应该意识到我可以通过自定义 Binder 使用 ModelState.AddModelError,我现在通过在返回模型之前将以下内容添加到我的自定义模型 Binder 中来使其正常工作到 Controller :

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 检查我的 Controller 操作现在返回 false

关于asp.net-mvc-3 - 在自定义模型绑定(bind)后验证 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com