Asp.Net: расширенная проверка диапазона - PullRequest
4 голосов
/ 31 октября 2008

Я использую Asp.Net 2.0. У меня есть сценарий, где мне нужно проверить пользовательский ввод по любому из двух диапазонов. Например, Мне нужно проверить значение текстового поля в диапазонах 100-200 или 500-600. Я знаю, что я могу подключить 2 Asp.Net RangeValidators к TextBox, но это попытается проверить входные данные по обоим диапазонам и условию AND, если хотите. CustomValidator является опцией, но как бы я передать значения 2 диапазонов со стороны сервера. Можно ли расширить RangeValidator для решения этой конкретной проблемы?

[Update] Извините, я не упомянул об этом, проблема для меня в том, что диапазон может варьироваться. А также различные элементы управления на странице будут иметь различные диапазоны в зависимости от некоторых условий. Я знаю, что могу хранить эти значения в некоторой переменной js или скрытом элементе ввода, но это не будет выглядеть очень элегантно.

Ответы [ 4 ]

4 голосов
/ 31 октября 2008

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));
}

Затем вам нужно будет установить для свойства OnServerValidate вашего CustomValidator значение «ValidateRange» или любое другое имя для вызова.

Это то, что вы ищете?

1 голос
/ 31 октября 2008

Я не верю, что это возможно при использовании стандартного элемента управления RangeValidator.

Я провел некоторый поиск и считаю, что вашим лучшим решением будет создание собственного элемента управления CustomValidator, который вы можете включить в свой проект для обработки этого сценария.

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

Вам не нужно компилировать его, чтобы использовать его в своем проекте, если вы правильно ссылаетесь на него.

1 голос
/ 31 октября 2008

Вы можете использовать RegularExpressionValidator со свойством ValidationExpression, установленным на

Редактировать: (упс, 650 и 201 и т. Д. Действовали по старому шаблону)

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

Это проверит введенный текст для 100-200 и 500-600.

0 голосов
/ 31 октября 2008

Я расширил 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; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...