【问题标题】:Custom Validation For Required fields必填字段的自定义验证
【发布时间】:2014-10-07 08:26:43
【问题描述】:

您好,我想要进行此类验证

[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代码。我只想要服务器端验证。

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

如果这需要更多说明,请告诉我,任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    如果您可以将验证数据注释放置在类本身上,您可以执行类似这篇文章(由 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;
            }
        }
    

    然后,在类上添加验证属性并发送要测试的枚举数组。这样,它将足够动态,以便稍后发送其他。在这种情况下,我将发送一个更新和删除枚举数组,因为您对这两个枚举有特殊情况。

    [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 属性上。

    【讨论】:

    • 我想像 [RequiredCustom(ActionType=(int)Action.Update, ActionType=(int)Action.Delete)] 一样使用它,你能说得更具体一点吗,我对你的不是很清楚解决方案。对象会包含我的 ActionType 属性吗??
    • Ajay,我更新了答案,使其更加清晰。请记住,就像我最初所说的那样,如果您使用类上的属性(因为您的验证依赖于类的另一个属性)而不是 NotedID 属性本身,这将起作用。如果您想在属性上添加一些验证消息等,这可能不是您期望的答案,但应该给您一个想法。如果您有任何问题,请告诉我。
    • 嗨@Krishna 它不能解决我的问题,因为我有多个属性用于此操作
    猜你喜欢
    • 2016-09-07
    • 2013-01-06
    • 2012-11-27
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2012-05-23
    • 2013-03-23
    相关资源
    最近更新 更多