【问题标题】:Custom Model Binder - How to revalidate自定义模型绑定器 - 如何重新验证
【发布时间】:2010-09-21 04:37:56
【问题描述】:

我正在使用 ASP.NET MVC 2,并想知道如何在使用自定义活页夹填充模型后重新触发验证。

所以,我从几个相关联的 EF 类开始,Booking 和 Traveler(每个预订可以有一个或多个 Traveler)

这是我用来在 Booking 上放置 balidation 的好友类:

[MetadataType(typeof(Booking_Validation))]
public partial class Booking {
    // partial class compiled with code produced by VS designer
}

[Bind(Include="Name")]
public class Booking_Validation {

    [Required(ErrorMessage="Booking name required")]
    public string Name { get; set; }

    [AtLeastOneTraveller(ErrorMessage="Please enter at least one traveller")]
    public EntityCollection<Traveller> Travellers;

}

public class AtLeastOneTraveller : ValidationAttribute {        
    public override bool IsValid(object value) {
        if (value != null) 
            return ((EntityCollection<Traveller>)value).Count > 0;
        return true;            
    }
}

我使用自定义模型绑定器来填充预订及其关联的旅行者,除了 ModelState.IsValid 似乎甚至在我的自定义模型绑定器有机会将旅行者添加到预订对象之前就已设置,即使在完成之后也是如此因此,ModelState["Travellers"] 仍然包含验证错误,指出必须至少连接一名旅行者。

有没有办法在自定义模型绑定完成后重新触发验证?

【问题讨论】:

    标签: asp.net-mvc custom-model-binder


    【解决方案1】:

    您是否尝试过 Controller 类的 TryValidateModel 方法?

    http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryvalidatemodel.aspx

    【讨论】:

    • 谢谢,但我似乎无法让它做正确的工作。当我运行 TryValidateModel 时,它返回 false,但似乎永远不会重新触发我的自定义 ValidationAttribute(我设置了断点)
    • 迟到 - 在调用我发现的 TryValidateModel 之前,您需要清除 ModelState 的错误,TryValidateModel 方法会将错误添加回 ModelState
    【解决方案2】:
    【解决方案3】:

    修复错误项后,您可以使用

    清除 ModelState
    ModelState.Clear();
    

    然后使用

    重新验证
    ModelState.IsValid
    

    【讨论】:

      猜你喜欢
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-20
      • 2019-11-16
      • 2015-08-30
      • 2012-12-08
      相关资源
      最近更新 更多