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