如何强制剃刀切换回客户端代码?

Gav*_*vin 4 razor asp.net-mvc-4

我的一个观点中有以下代码

@if (ViewBag.LoginInfo != null)
{
    var loginToken = "@ViewBag.LoginInfo.Token";
    var loginUser = "@ViewBag.LoginInfo.UserNameJs";
    var notifyUrl = "@ViewBag.LoginInfo.NotificationUrl";
}
Run Code Online (Sandbox Code Playgroud)

{}之间的代码应该以javascript的形式呈现给页面,但它似乎是作为服务器端代码运行的.我知道razor在看到html时切换回客户端代码,在这种情况下代码有效,如C#和javascript.如何强制将{}写入javasript写入页面之间?

谢谢

Dar*_*rov 10

你可以将它们包装在<text>标签中:

@if (ViewBag.LoginInfo != null)
{
    <text>
        var loginToken = @Html.Raw(Json.Encode(ViewBag.LoginInfo.Token);
        var loginUser = @Html.Raw(Json.Encode(ViewBag.LoginInfo.UserNameJs);
        var notifyUrl = @Html.Raw(Json.Encode(ViewBag.LoginInfo.NotificationUrl);
    </text>
}
Run Code Online (Sandbox Code Playgroud)

还要注意我是如何安全地编码值的.如果您的令牌包含该"字符,您的示例将生成无效的javascript .如果不使用安全的序列化程序,您永远不应该混合使用javascript和服务器端值,如我的示例所示.


Sta*_*ark 6

或者使用 @:

@if (ViewBag.LoginInfo != null)
{
    @:var loginToken = @Html.Raw(Json.Encode(ViewBag.LoginInfo.Token);
    @:var loginUser = @Html.Raw(Json.Encode(ViewBag.LoginInfo.UserNameJs);
    @:var notifyUrl = @Html.Raw(Json.Encode(ViewBag.LoginInfo.NotificationUrl);     
}
Run Code Online (Sandbox Code Playgroud)