自定义验证必填字段

时间:2014-10-07 08:26:44

标签: validation c#-4.0 model-view-controller asp.net-web-api data-annotations

嗨,我想要验证这种类似的东西

[RequiredCustom(ActionType=(int)Action.Update, ActionType=(int)Action.Delete)]
public string NotesID { get; set; }

[Required]
[RegularExpression("1|2|3|4")]
public int ActionType { get; set; }

我希望仅在进行更新和删除时验证此NotesID。我不需要任何不引人注目的javascript代码。我只想要服务器端验证。

请不要建议使用单独的模型我不能这样做。类似的解决方案也可以。

如果这需要更多说明,请告诉我。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果你可以将验证数据注释放在类本身上,你可以做一些像这篇文章的回答(由Gary.S建议)。

Here

在本质上,只需创建一个新的自定义验证属性,并且由于它是类级别的属性,您将可以访问该对象本身,从而访问其他属性。

您的自定义属性应该看起来像这样(假设您的类名是'Notes')

public class RequiredCustom: ValidationAttribute
    {
        List<int> actions;
        public RequiredCustom(int[] actions)
        {
            this.actions = new List<int>();
            this.actions.AddRange(actions);
        }

        public override bool IsValid(object value)
        {
            bool isValid = true;
            Notes testVal = value as Notes;
            if(this.actions.Contains((int)testVal.Action))
            {
                if(string.IsNullOrWhiteSpace(testVal.NotesID))
                {
                   isValid = false;
                }
            }
            return isValid;
        }
    }

然后,在类上添加validation属性并发送要测试的枚举数组。通过这种方式,它将足够动态,以便稍后发送。在这种情况下,我发送了更新和删除枚举的ARRAY,因为你有这两个特例。

[RequiredCustom(new int[] {(int)Action.Update, (int)Action.Delete)}]
public class Notes
{
   public string NotesID { get; set; }

   [Required]
   [RegularExpression("1|2|3|4")]
   public int ActionType { get; set; }
}

请记住,只有在类上设置属性而不是在NotesId属性上设置属性时,这才有效。

相关问题