1

ボットを取り除くための ReCaptcha を含むかなり標準的な MVC Web サイトの連絡先ページがあります。すべてが完璧に機能しています。サイトにモバイル ページを追加しましたが、可視性の懸念から、現在、モバイル ページのみのコントローラーでの recaptcha 検証を省略したいと考えています。

無効なキャプチャをチェックし、モバイル デバイスでない場合はモデルにエラーを追加し、Catch ブロックでキャッチするため、ローカルではこれは完全に機能します。モバイルがキャプチャを気にしない場合は、モデルを検証してください。

    [HttpPost, RecaptchaControlMvc.CaptchaValidator]
    [ValidateAntiForgeryToken]
    public ActionResult Submit(ContactFormViewModel viewModel, bool captchaValid, string captchaErrorMessage)
    {
        try
        {
            if (!captchaValid)
                if (!HttpContext.Request.Browser.IsMobileDevice)
                    ModelState.AddModelError("captcha", captchaErrorMessage);

            if (ModelState.IsValid)
            {
                if (viewModel.Save(viewModel))
                    return RedirectToAction("Thanks");
            }
            return View("Create");
        }
        catch (Exception ex)
        { //. . . error processing
        }

上記のように、これは、iPhone、iPad などに設定された Safari UserAgent と、さまざまな電話用の Opera エミュレーターの両方に対してローカルで完璧に機能します。しかし、本番環境にデプロイすると、Submit でエラーが発生し、Captcha エラーが表示されます。私にとって、これは .IsMobileDevice テストが失敗したことを意味します。

4

1 に答える 1

1

OK - これが私の問題を「解決」した方法です。標準の Web フォームで使用される「Submit」オブジェクトに渡される Recaptcha パラメーターに関係があるのではないかと考えたので、モバイル版ではフォーム送信を変更して、何も期待しない「MobileSubmit」メソッドを呼び出すようにしました。レキャプチャ関連。

それは単純に次のようになりました。

    //
    // POST: /Contact/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult MobileSubmit(ContactFormViewModel viewModel)
    {
        try
        {
            if (ModelState.IsValid)
            {
                if (viewModel.Save(viewModel))
                    return RedirectToAction("Thanks");
            }
            return View("Create");
        }
        catch (Exception ex)
        { . . . 
         }

そして、モバイルビューからの呼び出しは単純でした:

@using (Html.BeginForm("MobileSubmit", "Contact", null, FormMethod.Post, new { data_ajax = "false" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Contact</legend>
        @Html.Partial("_ContactFormPartial")

        <br />
        <input type="submit" value="Submit" />
        &nbsp;
        <input type="reset" value="Reset" />
    </fieldset>
}

IsMobile 呼び出しが最初に機能しない理由はまだわかりませんが、Recaptcha パラメータの追加が副作用を引き起こしていると推測しています。

乾杯、ダン

于 2012-10-30T12:47:03.963 に答える