从mvc控制器设置一个javascript变量

时间:2012-11-08 17:56:54

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

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

3 个答案:

答案 0 :(得分:7)

简答:

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

更长的答案:

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

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

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

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

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

将以以下方式发送到客户端浏览器:

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

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

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

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

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

确保输出是有效的JavaScript。

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

                }
            });