2008-10-30 126 views
4

我正在使用Asp.Net 2.0。我有一個場景,我需要檢查兩個範圍中的任何一個的用戶輸入。對於例如我需要檢查範圍100-200或500-600的文本框值。我知道我可以將2個Asp.Net RangeValidators連接到TextBox,但是如果您願意的話,它會嘗試驗證輸入是否符合範圍,AND條件。 CustomValidator是一個選項,但是如何從服務器端傳遞2個範圍值。是否有可能擴展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屬性設置爲

編輯:(哎呦,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

4

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爲「ValidateRange」,或任何你碰巧把它的OnServerValidate財產。

這是你之後的事情嗎?