在我的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");
处理此方案的最佳方法是什么
由于
答案 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)))
我认为这可以解决您的问题。