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

Ada*_*dam 5 javascript c# asp.net-mvc controller

是否可以从ac#controller设置javascript变量?我们有一种情况,我们用一个不需要为用户登录的哑dow版本覆盖我们的母版页.但是,我们的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);
}
Run Code Online (Sandbox Code Playgroud)

然后我们的javascript文件了.

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

大型应用程序,所以期待几乎不改变JavaScript.想从控制器处理它.

Soo*_*ead 7

简答:

<script>
    var xyz = @ViewData["MasterPageOverride"];
</script>
Run Code Online (Sandbox Code Playgroud)

更长的答案:

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

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

public ActionResult SomeAction()
{
    ViewData["aNumber"] = 24;
}
Run Code Online (Sandbox Code Playgroud)

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

<script>
    var xyz = @ViewData["aNumber"];
</script>
Run Code Online (Sandbox Code Playgroud)

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

<script>
    var xyz = 24;
</script>
Run Code Online (Sandbox Code Playgroud)

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

<script>
    var xyz = "@ViewData["aString"]";
</script>
Run Code Online (Sandbox Code Playgroud)

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

<script>
    var xyz = @ViewData["aJsonString"];
</script>
Run Code Online (Sandbox Code Playgroud)

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

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

<script>
    var xyz = @Html.Raw(ViewData["aJsonString"]);
</script>
Run Code Online (Sandbox Code Playgroud)