ASP.NET MVC - 在客户端JS中访问C#字符串

时间:2016-03-08 13:56:02

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

在我的控制器方法中,我有以下简单的逗号分隔字符串,我使用TempData传递给我的视图:

var test = "hi,bye";
TempData["test"] = test;

在我看来,我有以下js方法:

var desks = @(TempData["test"]).split(",");

当我使用Google Chrome开发者控制台检查DOM时,我看到以下内容:

var desks = hi,bye.split(",");

为什么我传递的TempData字符串会丢失它的引号并成为某种其他对象?我做错了什么?

2 个答案:

答案 0 :(得分:3)

您传递的字符串不会“丢失”其引号;字符串没有引号,即使字符串文字也没有。

你必须自己执行JavaScript字符串转义,如下所示:

'@(TempData["test"].
    Replace("\\", "\\\\").
    Replace("\n", "\\n").
    Replace("\r", "\\r").
    Replace("'", "\\'"))'.split(",");

这将创建一个转义字符串,该字符串可能足够安全,可以作为JavaScript字符串文字输出。

另一个选择是调用JSON序列化来输出字符串,这将覆盖所有基础。

@Html.Raw((new JavaScriptSerializer()).Serialize(TempData["test"])) .split(",");

JavaScriptSerializer.Serialize将接受任何对象(在本例中为字符串)并以JavaScript理解的方式输出。

然后

Html.Raw会确保将Serialize的输出写入输出流而不使用HTML编码

最后)个C#代码与JavaScript .split之间的额外空间是必要的。如果没有它,Razor会将split解释为C#方法的名称,而不是。

要使用JavaScriptSerializer课程,只需在视图顶部添加@using System.Web.Script.Serialization指令。

答案 1 :(得分:0)

你可以简单地做到:

'@(TempData["test"])'.split(",");

Javascript不会解释它是否是C#中的字符串。它只是在代码中写入字符串。您需要在C#代码之前和之后手动输入引号,因此javascript会将hi,bye读为字符串。