C# Asp.Net:扩展范围验证

C# Asp.Net:扩展范围验证,c#,asp.net,validation,C#,Asp.net,Validation,我正在使用Asp.NET2.0。我有一个场景,需要根据两个范围中的任何一个检查用户输入。例如,我需要对照范围100-200或500-600检查文本框值。我知道我可以将2个Asp.Net RangeValidator连接到文本框,但如果您愿意,这将尝试根据范围和条件验证输入。CustomValidator是一个选项,但是如何从服务器端传递2个范围值呢。是否可以扩展RangeValidator以解决此特定问题 [更新] 对不起,我没有提到这一点,我的问题是,范围可能会有所不同。此外,页面中的不同控件

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

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

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

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


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

我认为使用标准RangeValidator控件不可能做到这一点

我做了一些搜索,我相信您最好的解决方案是创建您自己的CustomValidator控件,您可以将其包含在项目中以处理此场景


只要您正确引用它,就不必为了在项目中使用而编译它。

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));
}
void ValidateRange(对象发送方、服务器验证目标)
{
int输入;
bool parseOk=int.TryParse(e.Value,out输入);
e、 IsValid=parseOk&&

((input>=100 | | input=500 | | input我扩展了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; }
    }
}
公共类RangeValidator Ex:BaseValidator
{
受保护的覆盖无效AddAttributesToRender(System.Web.UI.HtmlTextWriter)
{
base.AddAttributesToRender(编写器);
if(基本渲染级别)
{
字符串clientId=this.clientId;
//属性求值函数包含客户端js函数的名称。
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());
}
}
//将调用以验证参数
受保护的覆盖布尔控制属性有效()
{

if((Range1High这是一个更优雅的解决方案。做得好。我对正则表达式很糟糕。我对它们也不太擅长,但这不符合299和650的范围吗?是的,它符合。我现在对自己的答案感觉好多了:)我确实使用了RegExp路径。但在这种情况下它无法正常工作。无论如何,谢谢。哦,是的,让我来解决这个问题。一个优点是,对于客户端验证,regex语法也将是相同的。在调用RegisterScriptBlock之前,您可能需要检查IsClientScriptRegistered。。
    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; }
    }
}