2008-10-30 3 views
4

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

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

ответ

0

Я продлил 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; } 
    } 
} 
1

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

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

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

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

+0

Это гораздо более элегантное решение. Отлично сработано. Я ужасен с регулярными выражениями. – 2008-10-30 21:47:15

+0

Я тоже не очень хорош с ними, но разве это не соответствует 299 и 650, которые находятся за пределами диапазона? – korro 2008-10-30 21:53:12

1

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

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

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

Вы не должны компилировать его просто использовать его в проекте, до тех пор, как вы ссылаться на него правильно.

4

A 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», или что бы вы ни случилось назвать.

Это то, что вам нужно?

Смежные вопросы