2017-02-07 6 views
0

私はフォーム上でGoogle ReCaptcha要素を使用しています。 ReCaptchaはコントローラが取得する必要があるg-recaptcha-responseという名前のPOSTされたパラメータにパラメータを追加します。このパラメータ名は法的なC#変数名ではないので、(ビューモデルのプロパティへのモデルバインディングを経由するのではなく)Request.Params["g-recaptcha-response"]経由でその値を取得する唯一の方法があるようです。法的なC#変数名ではない名前へのバインド

私の問題は、POSTされたパラメータの他の場所に、HTMLマークアップを含む可能性のあるいくつかのフォームフィールドがあることです。私は[AllowHtml]というビューモデルの関連するプロパティに注釈を付けました。これは、ユーザーがフォームにHTMLマークアップを入力した場合、モデルバインダーがHttpRequestValidationExceptionを投げるのを防ぎます。しかし、[AllowHtml]明らかにはモデルバインダーでのみ動作します。ユーザーがフォームにHTMLマークアップを入力した場合、Request.Paramsを参照してReCaptchaレスポンスを取得すると、HttpRequestValidationExceptionと表示されます。

ReCaptchaの応答をフェッチして、選択したPOSTパラメータでHTMLマークアップを許可する唯一の方法は、カスタムモデルバインダー(たとえばhttps://stackoverflow.com/a/4316327/1637105)を書き込むという苦痛を経験することです私のビューモデルのプロパティをエイリアス(私の場合、有効なC#変数名ではないプロパティ名)にバインドします。

この質問のポイントは、カスタムモデルのバインダーを実装するのに苦労する必要があることを確認することです。

どのような提案や代替ソリューションも歓迎されています!

EDIT:

別のソリューションは(またはしながら、取り扱い)HttpRequestValidationExceptionをトリガすることなく、POSTされたパラメータから値を取得する方法を考え出すことであろうことを私に起こります。

答えて

1

Requestのプロパティを使用すると、要求の検証をトリガーせずに値にアクセスできます。例えば、

var captcha = Request.Unvalidated.Form["g-recaptcha-response"]; 
関連する問題