HttpContext.Request.Browser.IsMobileDevice不能仅用于生产?

时间:2012-10-29 13:26:10

标签: asp.net-mvc mobile

我有一个相当标准的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模拟器来说都是完美的。然而,当我部署到Production时,我显然在提交时出现错误,并显示我的Captcha错误。对我来说,这意味着.IsMobileDevice测试失败。

1 个答案:

答案 0 :(得分:1)

好的 - 所以这就是我如何“解决”我的问题。我认为它可能与Recaptcha参数传递给标准Web表单使用的“Submit”对象有关,所以对于移动版本我修改了表单submit来调用一个不期望任何东西的“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 params的添加引起了副作用。

干杯, 丹