Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何向模型字段添加附加验证?_C#_Asp.net Mvc_Validation - Fatal编程技术网

C# 如何向模型字段添加附加验证?

C# 如何向模型字段添加附加验证?,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我还有第二件事: <td> @Html.LabelFor(m => m.Number, titleHtmlAttrs) </td> <td> <span class="element-value2"> @Html.EditorFor(m => m.Number) @Html.ValidationTooltipFor(m => m.Number) </span> &

我还有第二件事:

<td>
    @Html.LabelFor(m => m.Number, titleHtmlAttrs)
</td>
<td>
    <span class="element-value2">
        @Html.EditorFor(m => m.Number)
        @Html.ValidationTooltipFor(m => m.Number)
    </span>
</td>
这意味着如果我想改变这个字段,我可以有从空到20的任意值。 没关系,但现在我需要一个额外的验证。 在模型中,我有一些字段:

public DateTime? TimeOf { get; set; }
public bool HasType { get; set; }
只有当TimeOf不为null且HasType为true时,新的验证才能工作。新的验证应防止数字中出现空值。基本上,将(从空到20)更改为(从1到20)

我怎样才能正确地做到这一点


p.很抱歉我的英语不好。

对于复杂的验证逻辑,请查看在
视图模型中的实现,然后您可以将条件验证逻辑放在
验证
方法中。(注意,这显然是服务器端)

公共IEnumerable验证(ValidationContext ValidationContext) { if(this.HasType) { //进行其他条件验证 如果(验证失败) { 返回新的ValidationResult(“此处出现描述性错误”); } } //这里还有其他验证。
更新我似乎误解了这个问题。正如另一个答案已经指出的,您可以实现IValidatableObject来实现这一点。类似于:

在TimeOf上,您可以使用必需的属性来确保其具有值:

[Required(ErrorMessage="Must have value")]
public DateTime? TimeOf {get;set;}
并在其他两个上使用自定义属性:

[SomeCustomValidator(ErrorMessage="Error msg...")]
public string Number {get;set;}

[IsTrueAttribute(ErrorMessage="Must be true")]
public bool HasType {get;set;}

查看
[RequiredIfTrue]
[RequiredIfNotEmpty]
验证属性您误解了这个问题。OP希望根据其他属性的值需要
编号。而您的
某个CustomValidator
的功能与
[StringLength]完全相同
没有,但没有客户端验证
public class YourModelName : IValidatableObject
{
  [StringLength(20)]
  public string Number{ get; set; }

  [Required]
  public DateTime? TimeOf { get; set; }

  public bool HasType { get; set; }

  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
  { 
    var results = new List<ValidationResult>();

    if (TimeOf != null && HasType)
       Validator.TryValidateProperty(this.Number,
            new ValidationContext(this, null, null) { MemberName = "Number" },
            results);    

    if (TimeOf == null) 
       results.Add(new ValidationResult("Date Time must have a value"));
    if (!HasType)
       results.Add(new ValidationResult("Must be true"));

    return results;
  }
public class SomeCustomValidator : ValidationAttribute
{
   protected override ValidationResult IsValid(object value, ValidationContext validationContext)
   {
      string number = value as string;
      if (value == null) throw new InvalidOperationException("Can only be used on string properties");

      if (!value.IsEmpty && value.Length <= 20)
      {
          return ValidationResult.Success;
      }

      return new ValidationResult("Name must be a non-empty string smaller than 20 chars"));
   }
}
public class IsTrueAttribute : ValidationAttribute
{

  public override bool IsValid(object value)
  {
      if (value == null) return false;
      if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");

      return (bool) value == true;
  }

}
[Required(ErrorMessage="Must have value")]
public DateTime? TimeOf {get;set;}
[SomeCustomValidator(ErrorMessage="Error msg...")]
public string Number {get;set;}

[IsTrueAttribute(ErrorMessage="Must be true")]
public bool HasType {get;set;}