2011-07-06 61 views
1

我已經創建了自定義服務器控件。到目前爲止,該控件在網頁中呈現一些html。在提交頁面時,我需要在服務器控件的文本框中輸入值,並調用一些web服務來驗證用戶的輸入。我不想把這段代碼寫在使用這個控件的頁面後面的代碼中。我希望所有的驗證都寫在服務器控件本身中,如果驗證失敗,Page.IsValid應該設置爲false。如果服務器控件中的用戶輸入值有效,則Page.IsValid將爲true。集成自定義控件控件驗證與Page.IsValid

我想實現的功能與google recaptcha相同。所有用戶需要做的就是使用這個控件來使用頁面中的控件。用戶輸入的值是正確的或不正確的在控制本身和頁面後面的代碼中處理,只有Page.IsValid。這裏是解釋這個

http://code.google.com/apis/recaptcha/docs/aspnet.html

對谷歌的頁面,我也使用了谷歌的reCAPTCHA,它按預期工作。我也想爲我的服務器控件構建相同類型的功能,如果可能,請幫助。

回答

1

感謝您回答問題。我找到了解決方案。以下是服務器控件的完整代碼。訣竅是實施IValidator。它給了我們兩個財產和一個方法。 ErrorMessage和IsValid屬性以及Validate方法。我在Validate方法中寫了所有驗證代碼並設置this.IsValid。這解決了這個問題。

[ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>")] 
public class MyControl : WebControl, IValidator 
{ 
    protected override void RenderContents(HtmlTextWriter output) 
    { 
     //Render the required html 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     this.RenderContents(writer); 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     Page.Validators.Add(this); 
     base.OnInit(e); 
    } 

    public string ErrorMessage 
    { 
     get; 
     set; 
    } 

    public bool IsValid 
    { 
     get; 
     set; 
    } 

    public void Validate() 
    { 
     string code = Context.Request["txtCode"]; 
     this.IsValid = Validate(code);//this method calls the webservice and returns true or false 
     if (!this.IsValid) 
     { 
      ErrorMessage = "Invalid Code"; 
     } 
    } 
} 
0

您可以將驗證器合併到服務器控件中。它需要一個服務器驗證方法來調用Web服務。

最終的結果將是您放在頁面上的服務器控件,不需要其他驗證程序。如果您的控件無法驗證其內容,則page.isvalid將爲false。

Simon

+0

simon,my server controls does not render any server side controls。它只呈現HTML文本框和一些隱藏的字段。我使用請求變量獲取用戶輸入,然後驗證它。你能否詳細說明你的方法。 – nccsbim071

+0

您的解決方案或多或少是我所建議的,但可能是更好的解決方案,因爲您沒有使用任何服務器控件。 –