Asp.Net:扩展范围验证

本文关键字:范围 验证 扩展 Net Asp | 更新日期: 2023-09-27 17:47:47

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

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

Asp.Net:扩展范围验证

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",或者您碰巧称之为"ValidateLange"

这就是你想要的东西吗?

我认为使用标准RangeValidator控件是不可能的。

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

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

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

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

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

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

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

我扩展了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; }
    }
}