5

是否可以从 ac# 控制器设置 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。想从控制器处理它。

4

3 回答 3

7

简短的回答:

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

更长的答案:

您不能在 Controller 中直接分配 JavaScript 变量,但在 View 中您可以输出可以执行相同操作的 JavaScript。

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

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

然后在视图中可以将其用作:

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

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

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

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

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

正如@Graham 在评论中提到的那样,如果字符串恰好是有效的JSON(或任何对象文字,但创建 JSON 非常容易),并且您想将其用作 JavaScript 对象,您可以:

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

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

在脚注中,请注意特殊的 HTML 字符,例如<它们会自动进行HTML 编码以防止 XSS 攻击,并且由于您输出的是 JavaScript 而不是 HTML,这可能会搞砸。为了防止这种情况,您可以使用Html.Raw()如下:

<script>
    var xyz = @Html.Raw(ViewData["aJsonString"]);
</script>
于 2012-11-08T18:05:54.640 回答
0

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

public dumbDownController(){
   ...
   tb.sessionTimer = function(){return false;}
}
于 2012-11-08T18:00:43.217 回答
0

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

从 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

                }
            });
于 2012-11-08T18:08:48.690 回答