【问题标题】:Set a javascript variable from mvc controller从 mvc 控制器设置一个 javascript 变量
【发布时间】:2012-11-08 17:56:54
【问题描述】:

是否可以从 c# 控制器设置 javascript 变量?我们有一种情况,我们用一个不需要用户登录的愚蠢版本覆盖我们的母版页。但是,我们的 javascript 超时计时器仍在运行。我想在覆盖主控的控制器方法中,将超时覆盖到一些巨大的东西。

public dumbDownController()
{
     ViewData["MasterPageOverride"] = "~/Views/Shared/_NoLogin.cshtml";

     //Somehow reset that timer below from 20 to like 9999. To simulate no timeout.

     return View("Cities", model);
}

那么我们的javascript文件就有了。

tb.sessionTimer = (function () {
   var SESSION_TIMEOUT = 20;
   var currentTimeoutCounter = SESSION_TIMEOUT * 60;
 ...
 lots more irrelevant to question
 ...
 }

大型应用程序,因此希望几乎不更改 javascript。想从控制器处理它。

【问题讨论】:

  • 您没有向我们展示 JS 计时器的实际初始化方式/位置,例如setTimeout.
  • 我假设您的控制器是用 JS 编写的。鉴于此,这没什么意义:“是否可以从控制器设置 javascript 变量?”
  • 它是用 C# 编写的。 @Madbreaks 这就是为什么我不确定它是否可能。

标签: c# javascript asp.net-mvc controller


【解决方案1】:

简答:

<script>
    var xyz = @ViewData["MasterPageOverride"];
</script>

更长的答案:

你不能在Controller中直接分配JavaScript变量,但是在View中你可以输出JavaScript,它可以做同样的事情。

您需要以某种方式将变量传递给视图。对于这个例子,我将使用ViewData 对象字典。你可以在Controller中设置一个元素:

public ActionResult SomeAction()
{
    ViewData["aNumber"] = 24;
}

然后在 View 中可以将其用作:

<script>
    var xyz = @ViewData["aNumber"];
</script>

这将被发送到客户端浏览器:

<script>
    var xyz = 24;
</script>

字符串需要多加注意,因为您需要将它们括在''"" 之间:

<script>
    var xyz = "@ViewData["aString"]";
</script>

正如 @Graham 在 cmets 中提到的,如果字符串恰好是有效的 JSON(或任何 object literal,但它是 very easy to create JSON),并且您想将其用作JavaScript 对象,你可以:

<script>
    var xyz = @ViewData["aJsonString"];
</script>

只要确保输出是有效的 JavaScript。

在脚注中,请注意特殊的 HTML 字符,例如 &lt;,因为它们会自动为 HTML-encoded 以防止 XSS 攻击,并且由于您输出的是 JavaScript 而不是 HTML,这可能会搞砸。为防止这种情况,您可以使用Html.Raw() like:

<script>
    var xyz = @Html.Raw(ViewData["aJsonString"]);
</script>

【讨论】:

  • 是的,这是最好的方法。在这里发表评论,例如“// Razor 和 JS 的混合!”,让新程序员知道您正在通过 Razor 打印出 JS,这不会有什么坏处。此外,您也可以使用 ViewModel 属性来执行此操作,而不仅仅是 ViewData。这是我现在正在处理的视图中的一行 JS: var json = @Html.Raw(Model.MemberPACJSONInfo); MemberPACJSONInfo 是一个用 JSON 填充的 ViewModel 字符串道具。通过这种方式渲染出来,我的 View 的 JS 可以访问同一个序列化对象。
【解决方案2】:

如果tb 在您的控制器范围内,请考虑重写 sessionTimer 函数:

public dumbDownController(){
   ...
   tb.sessionTimer = function(){return false;}
}

【讨论】:

    【解决方案3】:

    你有两个选择(据我所知):

    从viewbag、data、tempdata创建变量,像这样:

    var SESSION_TIMEOUT = @ViewData["MasterPageOverride"];
    var SESSION_TIMEOUT = @ViewBag["MasterPageOverride"];
    var SESSION_TIMEOUT = @TempData["MasterPageOverride"];
    

    或者,通过 jQuery AJAX 来实现:

    $.ajax({
                    url: '/YourController/YourAction',
                    type: 'post',
                    data: { id: id },
                    dataType: 'json',
                    success: function (result) {
                        // setVar
    
                    }
                });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多