MVC - 处理新行的未终止字符串文字

时间:2013-10-17 11:43:18

标签: javascript asp.net-mvc

在我的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"); 

处理此方案的最佳方法是什么

由于

3 个答案:

答案 0 :(得分:8)

  

处理此方案的最佳方法是什么

使用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数组。

P.S:如果Razor Intellisense在此代码周围放置红色波形,请不要担心。 Razor视图中的Visual Studio Intellisense不能很好地工作。只需忽略警告并运行您的应用程序并观察正确生成的代码。

答案 1 :(得分: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完全安全(并为您处理异常)。

答案 2 :(得分:1)

试试这个

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

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