在我的控制器方法中,我有以下简单的逗号分隔字符串,我使用TempData传递给我的视图:
var test = "hi,bye";
TempData["test"] = test;
在我看来,我有以下js方法:
var desks = @(TempData["test"]).split(",");
当我使用Google Chrome开发者控制台检查DOM时,我看到以下内容:
var desks = hi,bye.split(",");
为什么我传递的TempData字符串会丢失它的引号并成为某种其他对象?我做错了什么?
答案 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
读为字符串。