gpt4 book ai didi

asp.net-mvc - 修改后如何在继承自 DefaultModelBinder 的自定义模型 Binder 中重新验证我的模型?

转载 作者:行者123 更新时间:2023-12-01 23:34:21 24 4
gpt4 key购买 nike

我有一个继承自 DefaultModelBinder 的自定义模型绑定(bind)器。我想要它做的是在模型上设置一个 DefaultModelBinder 无法解析的属性。它看起来像这样:

public class FooModelBinder : DefaultModelBinder  {
public override void BindModel(ControllerContext controllerContext, ModelBindingContext modelBindingContext)
{
var model = base.BindModel(controllerContext, bindingContext);
((IFooModel)model).Bar = GetBarFromSomewhere();

return model;
}
}

但是,由于 IFooModel 中的 Bar 属性不能为 null,并且我使用 FluentValidation 时有一条规则说明,在我调用 base.BindModel 之后,ModelState 将无效。

所以我想避免在调用 base.BindModel 时验证模型,或者至少清除错误并在设置 Bar 属性后重新验证模型。

我已经尝试解析验证器并验证模型,但我似乎无法让它真正运行验证,并且它不会导致任何错误(即使它应该):

var validators = bindingContext.ModelMetadata.GetValidators(controllerContext);
foreach(var validator in validators) {
foreach (var result in validator.Validate(model)) {
bindingContext.ModelState.AddModelError(result.MemberName, result.Message);
}
}

在我返回模型之前运行它之后,验证器包含一个 FluentValidationModelValidator,但是当我调用 validator.Validate 时,我没有收到任何错误。我的模型上有另一个属性,当我之前运行 base.BindModel 时它确实导致了错误,所以我希望这里会发生同样的错误。

最佳答案

您可以尝试覆盖 BindProperty 方法,而不是覆盖 BindModel 方法:

public class FooModelBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.Name == "Bar")
{
var model = bindingContext.Model as IFooModel;
if (model != null)
{
model.Bar = GetBarFromSomewhere();
}
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}

关于asp.net-mvc - 修改后如何在继承自 DefaultModelBinder 的自定义模型 Binder 中重新验证我的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9299093/

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