Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set a javascript variable from mvc controller

Is it possible to set a javascript variable from a c# controller? We have a situation where we override our master page with a dumb downed version that doesn't require login for users. However, our javascript timeout timer still runs. I would like to in the controller method that overrides the master, to override the timeout to something huge.

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);
}

Then our javascript file has.

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

Large app, so looking to barely change the javascript. Would like to handle it from the controller.

like image 494
Adam Avatar asked Nov 08 '12 17:11

Adam


1 Answers

Short Answer:

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

Longer Answer:

You can't directly assign JavaScript variables in the Controller, but in the View you can output JavaScript which can do the same.

You need to pass the variable to the View somehow. For this example I'll use the ViewData object dictionary. You can set an element in the Controller:

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

Then in the View it is possible to use it as:

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

Which will be sent to the client browser as:

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

Strings need a bit more attention, since you need to enclose them between '' or "":

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

And as @Graham mentioned in the comments, if the string happens to be valid JSON (or any object literal, but it is very easy to create JSON), and you want to use it as a JavaScript object, you can:

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

Just make sure the output is valid JavaScript.

On a footnote, be careful with special HTML characters, like < as they are automatically HTML-encoded to prevent XSS attacks, and since you are outputting JavaScript not HTML, this can mess things up. To prevent this, you can use Html.Raw() like:

<script>
    var xyz = @Html.Raw(ViewData["aJsonString"]);
</script>
like image 133
vinczemarton Avatar answered Oct 24 '22 02:10

vinczemarton