EPiServer 内で XForms の出力を変更した経験はありますが、キャプチャ コントロールを追加したことはありません。私はあなたがそこに着くのを手伝うことができることを願っています!
XFormControl.BeforeLoadingForm イベントで XForms 出力のすべての変更を行います。Global.asax.cs 内でこれにイベント ハンドラーを割り当てるか、誰かが初めてフォーム ページに移動したときにインスタンス化する静的初期化クラスを作成することができます (私のテンプレート クラスはこの初期化クラスから継承されます)。 Global.asax を変更せずにデプロイ可能な優れたソリューションが必要でした。とにかく脱線します。
今のところ、作業を開始するためだけに、Global.asax.cs 内で実行することをお勧めします。PublicTemplates パックと共にインストールされる Global.asax.cs 内にサンプル コードがあります。「Global XFrom Events」領域を探します。
XForm の「マークアップ」は、BeforeLoadingForm イベント引数を通じて公開されます。
e.FormDefinition
この文字列を変更すると、ユーザーが XForm エディター内で何を作成したかに関係なく、フォームのレンダリング出力が変更されます。例えば:
e.FormDefinition += "<asp:HyperLink runat=\"server\" Text=\"HyperLink\" />";
この例では明らかに現在存在するものにマークアップを追加しますが、必要に応じて元のマークアップを完全に変換できます。(正規表現を使用して、テーブルを div/fieldset タグに変換します)
これが解決に役立つことを願っています。
Global.asax.cs のコード例
protected void Application_Start(Object sender, EventArgs e)
{
XFormControl.ControlSetup += new EventHandler(XForm_ControlSetup);
}
public void XForm_ControlSetup(object sender, EventArgs e)
{
XFormControl control = (XFormControl)sender;
control.BeforeLoadingForm += new LoadFormEventHandler(XForm_BeforeLoadingForm);
}
public void XForm_BeforeLoadingForm(object sender, LoadFormEventArgs e)
{
XFormControl formControl = (XFormControl)sender;
//We set the validation group of the form to match our global validation group in the master page.
formControl.ValidationGroup = "XForm";
e.FormDefinition += "<asp:HyperLink runat=\"server\" NavigationUrl=\"#\" Text=\"HyperLink\" />";
}
編集:
申し訳ありませんが、上記のコードはキャプチャ コントロールをフォームに統合するのに役立ちますが、フォームを送信する前にキャプチャ コントロールの入力が有効かどうかを実際に確認する部分を完全に見逃してしまいました。
XFormControl.BeforeSubmitPostedData 内でコントロールのチェックを実行することに同意します。キャプチャが有効でない場合は、エラー メッセージを出力し、e.CancelSubmit を true に設定します。
コメントへの返信:
単純化しすぎているかもしれませんが、これはあなたが必要だと思うものの簡単な例です。XForm ユーザー コントロール コードでは、次のようなものが必要です。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.FormControl.BeforeLoadingForm += new LoadFormEventHandler(FormControl_BeforeLoadingForm);
this.FormControl.BeforeSubmitPostedData += new SaveFormDataEventHandler(FormControl_BeforeSubmitPostedData);
}
void FormControl_BeforeLoadingForm(object sender, LoadFormEventArgs e)
{
e.FormDefinition += "<recaptcha:RecaptchaControl runat=\"server\" id=\"CaptchaControl\" />";
}
void FormControl_BeforeSubmitPostedData(object sender, SaveFormDataEventArgs e)
{
/* find the captcha control e.g. FormControl.FindControl("CaptchaControl") or otherwise
* test if the control is valid
* if not valid e.CancelSubmit = true (show error etc.)
*/
}
上記の例のように、web.config またはテンプレート/ユーザーコントロール マークアップの先頭に Recaptcha コントロールが登録されている限り、それは機能するはずです。キャプチャ コントロールがフォームの最後に追加されていることがわかります (おそらく、実際に配置したい場所ではないかもしれませんが、これは、フォーム内で挿入したい場所を特定できる限り、独自の方法で変更できます)。 e.FormDefinition 文字列。
「FormControl」は、ユーザー コントロール マークアップ内の XForm コントロールです。
編集 (2010 年 12 月 23 日):
キャプチャ コントロールは、マークアップ ファイルの先頭ではなく、web.config 内に登録する必要があります。
<add tagPrefix="recaptcha" namespace="Recaptcha" assembly="Recaptcha" />