【问题标题】:Asp.Net : Extended range validationAsp.Net:扩展范围验证
【发布时间】:2008-10-30 21:27:02
【问题描述】:

我正在使用 Asp.Net 2.0。我有一个场景,我需要根据两个范围中的任何一个检查用户输入。例如我需要根据范围 100-200 或 500-600 检查文本框值。我知道我可以将 2 个 Asp.Net RangeValidators 连接到 TextBox,但这将尝试根据两个范围验证输入,一个 AND 条件,如果你愿意的话。 CustomValidator 是一个选项,但我将如何从服务器端传递 2 个范围值。是否可以扩展 RangeValidator 来解决这个特定问题?

[更新] 抱歉,我没有提到这一点,对我来说,问题是范围可能会有所不同。并且页面中的不同控件也会根据某些条件具有不同的范围。我知道我可以将这些值保存在一些 js 变量或隐藏的输入元素中,但它看起来不会很优雅。

【问题讨论】:

    标签: c# asp.net validation


    【解决方案1】:

    CustomValidator 应该可以工作。我不确定“从服务器端传递 2 个范围值”是什么意思。您可以使用如下验证方法在服务器端对其进行验证:

    void ValidateRange(object sender, ServerValidateEventArgs e)
    {
        int input;
        bool parseOk = int.TryParse(e.Value, out input);
        e.IsValid = parseOk &&
                    ((input >= 100 || input <= 200) ||
                    (input >= 500 || input <= 600));
    }
    

    然后,您需要将 CustomValidator 的 OnServerValidate 属性设置为“ValidateRange”,或者您碰巧称呼它的任何名称。

    这是你所追求的吗?

    【讨论】:

      【解决方案2】:

      我不相信使用标准 RangeValidator 控件可以做到这一点。

      我进行了一些搜索,我相信您最好的解决方案是创建您自己的 CustomValidator 控件,您可以将其包含在您的项目中以处理这种情况。

      http://www.dotnetjunkies.ddj.com/Article/592CE980-FB7E-4DF7-9AC1-FDD572776680.dcik

      只要你正确引用它,你不应该仅仅为了在你的项目中使用它而编译它。

      【讨论】:

        【解决方案3】:

        您可以使用将 ValidationExpression 属性设置为的 RegularExpressionValidator

        编辑:(哎呀,650 和 201 等对旧模式有效)

        ^(1\d{2}|200|5\d{2}|600)$
        

        这将测试输入的文本是否为 100-200 和 500-600。

        【讨论】:

        • 这是一个更优雅的解决方案。做得好。我对正则表达式很糟糕。
        • 我对它们也不是很好,但这不也匹配超出范围的299和650吗?
        • 是的,确实如此。我现在对自己的答案感觉好多了:)
        • 我确实走上了正则表达式的道路。但在这种情况下它将无法正常工作。无论如何,谢谢。
        • 哦,是的,让我来解决这个问题。一个优点是客户端验证的正则表达式语法也相同。
        【解决方案4】:

        我扩展了 BaseValidator 来实现这一点。一旦你了解了验证器的工作原理,它就相当简单了。我已经包含了一个粗略的代码版本来演示它是如何完成的。请注意,它是针对我的问题量身定制的(例如 int 应该始终 > 0),但您可以轻松扩展它。

            public class RangeValidatorEx : BaseValidator
        {
        
            protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
            {
                base.AddAttributesToRender(writer);
        
                if (base.RenderUplevel)
                {
                    string clientId = this.ClientID;
        
                    // The attribute evaluation funciton holds the name of client-side js function.
                    Page.ClientScript.RegisterExpandoAttribute(clientId, "evaluationfunction", "RangeValidatorEx");
        
                    Page.ClientScript.RegisterExpandoAttribute(clientId, "Range1High", this.Range1High.ToString());
                    Page.ClientScript.RegisterExpandoAttribute(clientId, "Range2High", this.Range2High.ToString());
                    Page.ClientScript.RegisterExpandoAttribute(clientId, "Range1Low", this.Range1Low.ToString());
                    Page.ClientScript.RegisterExpandoAttribute(clientId, "Range2Low", this.Range2Low.ToString());
        
                }
            }
        
            // Will be invoked to validate the parameters 
            protected override bool ControlPropertiesValid()
            {
                if ((Range1High <= 0) || (this.Range1Low <= 0) || (this.Range2High <= 0) || (this.Range2Low <= 0))
                    throw new HttpException("The range values cannot be less than zero");
        
                return base.ControlPropertiesValid();
            }
        
            // used to validation on server-side
            protected override bool EvaluateIsValid()
            {
                int code;
                if (!Int32.TryParse(base.GetControlValidationValue(ControlToValidate), out code))
                    return false;
        
                if ((code < this.Range1High && code > this.Range1Low) || (code < this.Range2High && code > this.Range2Low))
                    return true;
                else
                    return false;
            }
        
            // inject the client-side script to page
            protected override void OnPreRender(EventArgs e)
            {
                   base.OnPreRender(e);
        
                   if (base.RenderUplevel)
                   {
                       this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "RangeValidatorEx", RangeValidatorExJs(),true);
                   }
            }
        
        
            string RangeValidatorExJs()
            {
                string js;
                // the validator will be rendered as a SPAN tag on the client-side and it will passed to the validation function.
                js = "function RangeValidatorEx(val){ "
                + " var code=document.getElementById(val.controltovalidate).value; "
                + " if ((code < rangeValidatorCtrl.Range1High && code > rangeValidatorCtrl.Range1Low ) || (code < rangeValidatorCtrl.Range2High && code > rangeValidatorCtrl.Range2Low)) return true; else return false;}";
                return js;
            }
        
        
            public int Range1Low
            {
                get {
                    object obj2 = this.ViewState["Range1Low"];
        
                    if (obj2 != null)
                        return System.Convert.ToInt32(obj2);
        
                    return 0;
        
                }
                set { this.ViewState["Range1Low"] = value; }
            }
        
            public int Range1High
            {
                get
                {
                    object obj2 = this.ViewState["Range1High"];
        
                    if (obj2 != null)
                        return System.Convert.ToInt32(obj2);
        
                    return 0;
        
                }
                set { this.ViewState["Range1High"] = value; }
            }
            public int Range2Low
            {
                get
                {
                    object obj2 = this.ViewState["Range2Low"];
        
                    if (obj2 != null)
                        return System.Convert.ToInt32(obj2);
        
                    return 0;
        
                }
                set { this.ViewState["Range2Low"] = value; }
            }
            public int Range2High
            {
                get
                {
                    object obj2 = this.ViewState["Range2High"];
        
                    if (obj2 != null)
                        return System.Convert.ToInt32(obj2);
        
                    return 0;
        
                }
                set { this.ViewState["Range2High"] = value; }
            }
        }
        

        【讨论】:

        • 您可能需要在调用 RegisterScriptBlock 之前检查 IsClientScriptRegistered..
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-03
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2014-05-06
        • 1970-01-01
        相关资源
        最近更新 更多