【问题标题】:How to determine if JavaScript is enabled through MVC如何确定是否通过 MVC 启用了 JavaScript
【发布时间】:2019-12-04 11:20:42
【问题描述】:

我有一个视图,它在单击 href 时调用函数“版本”,通常返回一个“版本.cshtml”。 我修改了那个Controllerfunction: 如果我单击该链接并启用 JavaScript,它会启动一个返回 JSON 结果的 ajax 调用。它会修改 DOM,因此页面不会重新加载。现在我的问题是区分何时启用 JavaScript - 如果启用,它应该返回 JSON 结果;如果禁用它应该返回“Version.cshtml”。当我检查元素时,当 JS 被禁用时,我们已经有一个名为“nojs-noborder”的类。但是我如何在没有 JS 的情况下通过控制器获取该值,以便我可以填充 bool 'isJavaScriptenabled'?

控制器函数如下所示:

   if (isJavaScriptEnabled)
        {

            var tocstr = ControllerContext.RenderView(PartialView("Versiontoc", model));
            var middlestr = ControllerContext.RenderView(PartialView("Versionmiddle", model));
            var result = new JsonResult
            {
                Data = new { tocstr, middlestr },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                MaxJsonLength = MaxValue
            };

            return result;
        }
        return View("Version", model);

被检查元素中的类:

<div class="nojs-noborder" id="contentwrapper">

【问题讨论】:

  • 浏览器必须将该信息作为请求中的参数发送。服务器无法访问浏览器的设置以了解启用或未启用的内容。事实上,服务器甚至不知道(或关心)请求是来自浏览器还是来自其他类型的 HTTP 客户端。
  • 老实说,虽然我认为您应该为此设置两种不同的操作方法,并让前端决定在每种情况下调用哪一种。拥有一个返回两种完全不同类型的内容的端点有点反模式恕我直言。

标签: javascript html asp.net-mvc noscript


【解决方案1】:

从您的回答中不清楚您是否已这样做,但您需要更新视图以发出 AJAX 请求或遵循锚标记,具体取决于 JavaScript 是否启用。

然后,在您的控制器中,您不需要确定浏览器中是否启用了 JavaScript,而是需要确定请求是否为 AJAX 请求。如果是,则返回 JSON,否则返回视图。

大多数 JavaScript 库都会在 X-Requested-With 标头后面附加 XMLHttpRequest 的值。您可以检查此标头是否存在。

我不确定您使用的是哪个版本的 MVC,但您可以使用内置的 Request.IsAjaxRequest() 来确定这一点。

然后你的 ActionMethod 变成:

if (Request.IsAjaxRequest())
{
    var tocstr = ControllerContext.RenderView(PartialView("Versiontoc", model));
    var middlestr = ControllerContext.RenderView(PartialView("Versionmiddle", model));
    var result = new JsonResult
    {
        Data = new { tocstr, middlestr },
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        MaxJsonLength = MaxValue
    };

    return result;
}
return View("Version", model);

如果此方法不可用,您可以自己滚动based on this answer

【讨论】:

  • 谢谢!它就像一个魅力,你只是为我节省了这么多小时的挫败感。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多