1

我有一个相当标准的 MVC 网站联系页面,其中包括用于清除机器人的 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 模拟器都非常有效。然而,当我部署到生产环境时,我不断收到提交时抛出的错误,并显示我的验证码错误。对我来说,这意味着 .IsMobileDevice 测试失败。

4

1 回答 1

1

好的-这就是我“解决”我的问题的方法。我认为这可能与传递给标准 Web 表单使用的“提交”对象的 Recaptcha 参数有关,因此对于移动版本,我修改了表单提交以调用不期望任何内容的“MobileSubmit”方法Recaptcha 相关。

结果很简单:

    //
    // 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 回答