5

在我的 MVC 视图中,我有以下代码

<script type="text/javascript">
@foreach (var item in Model.Test)
{
<text> jsFunction(@item.someValue);  </text>
}
</script>

根据我从模型动态获得的数据在哪里调用 Javascript 函数。

例如在运行时,它根据模型数据呈现如下

jsFunction("Works Fine");  
jsFunction("works Fine"); 

哪个正确调用我的javascript函数

但是如果新行由于新行而获得“未终止的字符串文字”

jsFunction("not working
with new line"); 

处理这种情况的最佳方法是什么

谢谢

4

3 回答 3

9

处理这种情况的最佳方法是什么

使用 JSON 序列化程序,这将确保传递给您的 javascript 函数的值被正确转义:

<script type="text/javascript">
@foreach (var item in Model.Test)
{
    <text>jsFunction(@Html.Raw(Json.Encode(item.someValue)));</text>
}
</script>

或者,如果您更新您jsFunction的数组而不是单个项目,您可以这样做:

<script type="text/javascript">
    var values = @Html.Raw(Json.Encode(Model.Test));
    jsFunction(values);
</script>

然后遍历将传递给您的函数的普通 javascript 数组。

PS:不要担心 Razor Intellisense 是否在此代码周围添加了红色曲线。Razor 视图中的 Visual Studio Intellisense 无法正常工作。只需忽略警告并运行您的应用程序并观察正确生成的代码。

于 2013-10-17T11:49:25.800 回答
2

最简单的解决方案是创建一个助手或其他东西:

@* declared at top of razor page *@
@helper jsFunction(String str)
{
    str = (str ?? String.Empty).Trim().Replace(Environment.NewLine, "\\n");
    @:jsFunction("@Html.Raw(str)");
}

@* example usage *@
foreach (var item in Model.Test)
{
    @jsFunction(@item.Comment)
}

这将对字符串执行清理以使其转换\n为 JavaScript 对应部分\\n。您还可以包括引号的例外情况(变成"\"

更好的选择是使用类似 JSON.NET 的东西:

<text>jsFunction(@Html.Raw(JsonConvert.Serialize(@item.Comment)))</text>

这将使 JavaScript 完全安全(并为您处理异常)。

于 2013-10-17T11:47:48.387 回答
1

试试这个

jsFunction(@Html.Raw(Json.Encode(item.Comment)))

我认为这应该可以解决您的问题。

于 2013-10-17T11:49:37.270 回答