Asp.net mvc HttpContext.Request.Browser.IsMobileDevice是否仅在生产环境中工作?

Asp.net mvc HttpContext.Request.Browser.IsMobileDevice是否仅在生产环境中工作?,asp.net-mvc,mobile,Asp.net Mvc,Mobile,我有一个相当标准的MVC网站联系人页面,其中包括ReCaptcha以清除机器人。一切都很顺利。我向站点添加了移动页面,由于可见性问题,我目前只希望在控制器中省略移动页面的recaptcha验证 在本地,这非常有效,因为我检查了无效的captcha,如果不是移动设备,我会将错误添加到模型和catch in catch块中。如果mobile不担心验证码,只需验证模型即可 [HttpPost, RecaptchaControlMvc.CaptchaValidator] [Validat

我有一个相当标准的MVC网站联系人页面,其中包括ReCaptcha以清除机器人。一切都很顺利。我向站点添加了移动页面,由于可见性问题,我目前只希望在控制器中省略移动页面的recaptcha验证

在本地,这非常有效,因为我检查了无效的captcha,如果不是移动设备,我会将错误添加到模型和catch in catch块中。如果mobile不担心验证码,只需验证模型即可

    [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用户代理以及各种手机的Opera emulator都非常适合本地使用。然而,当我部署到生产环境时,我不断地在提交时抛出一个错误,并显示我的验证码错误。对我来说,这意味着.IsMobileDevice测试失败。

好-下面是我如何“解决”我的问题的。我认为这可能与将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>
}
@使用(Html.BeginForm(“MobileSubmit”,“Contact”,null,FormMethod.Post,new{data_ajax=“false”}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
接触
@Html.Partial(“\u ContactFormPartial”)

}

所以仍然不确定IsMobile调用最初为什么不起作用,但我猜测添加Recaptcha参数会导致副作用

干杯, Dan

好的-下面是我如何“解决”我的问题。我认为这可能与将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>
}
@使用(Html.BeginForm(“MobileSubmit”,“Contact”,null,FormMethod.Post,new{data_ajax=“false”}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
接触
@Html.Partial(“\u ContactFormPartial”)

}

所以仍然不确定IsMobile调用最初为什么不起作用,但我猜测添加Recaptcha参数会导致副作用

干杯, 丹