2011-07-06 15 views
1

私はカスタムサーバーコントロールを作成しました。これまでのところ、このコントロールはWebページにいくつかのhtmlをレンダリングします。ページの提出時に私は、サーバーコントロールのテキストボックスに入力された値を取って、ユーザーの入力を検証するためにいくつかのWebサービスを呼び出す必要があります。私は、このコントロールが使用されているページのコードの裏にこのコードを書いてはいけません。すべてのバリデーションをサーバーコントロール自体に書き出し、検証に失敗した場合はPage.IsValidをfalseに設定する必要があります。サーバーコントロールのユーザー入力値が有効な場合、Page.IsValidはtrueになります。カスタムコントロールコントロールの検証とPage.IsValidの統合

私は達成しようとしていますGoogleのrecaptchaと同じ機能です。すべてのユーザーがこのコントロールを使用するために必要とするのは、ユーザーがページ内のコントロールを操作することです。ユーザーが入力した値が正しいか正しくないかは、コントロール自体で処理され、ページのコードの背後には、Page.IsValidしかありません。ここでは、この

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

を説明してGoogleでページがあると私はまた、GoogleのreCAPTCHAのを使用しているし、期待どおりに動作します。私はまた、私のサーバーコントロールのための同じ種類の機能を構築したい、可能であれば、助けてください。

答えて

1

ありがとうございます。私は解決策を見つけた。ここにサーバーコントロールのコード全体があります。そのトリックはIValidatorを実装することでした。それは私たちに2つのプロパティと1つのmetodを与えます。 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になります。

シモン

+0

simon、私のサーバーコントロールはサーバー側のコントロールをレンダリングしません。これは、htmlテキストボックスといくつかの隠しフィールドだけをレンダリングします。私は、要求変数を使用してユーザー入力を取得し、それを検証します。あなたは少しあなたの方法を詳しく教えてください。 – nccsbim071

+0

あなたのソリューションは多かれ少なかれ私が提案したものですが、おそらくあなたがサーバーコントロールを使用していないので、より良い解決策です。 –

関連する問題