如何在asp.net mvc3中允许无值或特定值的属性

本文关键字:属性 许无值 asp net mvc3 | 更新日期: 2023-09-27 18:05:49

我有3个属性的自定义类,它的日期,小时和分钟。这些表示用户可以输入的字段,但它们不是必需的,但是如果一个字段被填充,那么其他两个字段也应该被填充(不确定这部分在纯c#中是可能的)

我把这个代码改成

    [RegularExpression("[0-9]{2}-[0-9]{2}-[0-9]{4}", ErrorMessage = "Date should be in the following format: dd-mm-yyyy")]
    [MaxLength(10)]
    public string Date { get; set; }
    [CustomRange(0, 24, ErrorMessage = "Hour must be between 00 and 24")]
    public string Hour { get; set; }
    [CustomRange(0, 59, ErrorMessage = "Hour must be between 00 and 59")]
    public string Minute { get; set; }

.

    public class CustomRangeAttribute : ValidationAttribute
{
    public int Min { get; set; }
    public int Max { get; set; }

    public CustomRangeAttribute(int min, int max)
    {
        Min = min;
        Max = max;
    }
    public override bool IsValid(object value)
    {
        var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture);
        int tmp;
        if(int.TryParse(stringValue, out tmp))
        {
            return tmp >= Min && tmp <= Max;
        }
        return false;
    }
}

日期部分工作得很好,那一个是可选的,但它抱怨的小时和分钟,好像他们有[Required],所以有可能使他们可选吗?

我改了,所以我用正则表达式代替

    [RegularExpression("[0-9]{2}-[0-9]{2}-[0-9]{4}", ErrorMessage = "Date should be in the following format: dd-mm-yyyy")]
    [MaxLength(10)]
    public string Date { get; set; }
    [RegularExpression("[0-1]{1}[0-9]{1}|[2]{1}[0-3]{1}")]
    public string Hour { get; set; }
    [RegularExpression("[0-5]{1}[0-9]{1}")]
    public string Minute { get; set; }

如何在asp.net mvc3中允许无值或特定值的属性

为了满足某些字段仅在某些情况下需要的要求,您可以使用IValidateableObject

实现自定义验证逻辑

如何使用IValidatableObject?

提供一个很好的概述

基本上

public MyCustomClass:IValidateableObject
{
 public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)    
 { 
      //your custom "model-wide" business rules here
 }
}

至于小时和分钟,是否有任何理由使用字符串而不是可空的int?

ie

[Range(0,24,ErrorMessage="Hour must be between 00 and 24")]
public int? Hour {get; set;}

编辑:好了,现在你已经编辑了你的第一篇文章,并包括了你的自定义验证属性,它不工作的原因很明显

当前代码

 public override bool IsValid(object value)     { 
        var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture); 
        int tmp;
         if(int.TryParse(stringValue, out tmp))
         {
             return tmp >= Min && tmp <= Max;
         } 
        return false; 
    }

当value == null时返回false。

添加nullorempty值的检查是您需要的,即

   public override bool IsValid(object value)     { 
       var stringValue = Convert.ToString(value, CultureInfo.CurrentCulture); 
       if (String.IsNullOrEmpty(stringValue))
       {
            return true;
       }
        int tmp;
         if(int.TryParse(stringValue, out tmp))
         {
             return tmp >= Min && tmp <= Max;
         } 
        return false; 
    }