我有一个 JavaScript
if
条件,在部分视图内包含一些比较运算符(<=
、>=
)。该 JavaScript 被 MVC Razor <text>
标签包围。
这样,我的 JS 就会根据模型属性动态加载。但是,如果我在 JavaScript 方法中有比较运算符,则会引发错误。
工作场景:
@if (Model.SomeTrueCondition)
{
<text>
function JSMethod() {
AnotherJSMethod();
return;
}
</text>
}
不起作用的场景(如果我使用比较运算符调用
AnotherJSMethod()
)
@if (Model.SomeTrueCondition)
{
<text>
function JSMethod() {
// This if condition containing comparison operators are not being accepted!
if ($('#aTextBox').val().length <= 0 || $('#bTextBox').val().length <= 0) {
AnotherJSMethod();
return;
}
}
</text>
}
我尝试将此 JS 方法移动到另一个 .js 文件中,并尝试嵌入以下方式,但我仍然看到相同的问题。
@section JavaScriptIncludes
{
<script type="text/javascript" src="@Url.Content("/Scripts/SomeScript.js")" />
}
出现以下错误,
描述:解析服务此请求所需的资源时发生错误。请查看以下具体解析错误详细信息并适当修改您的源文件。
解析器错误消息:在解析“”标记之前到达文件结尾或意外字符。 标记块内的元素必须完整。它们必须是自闭合的(“
”)或具有匹配的结束标记(“Hello</p>”)。 如果您打算显示“<" character, use the "<" HTML entity.
Pl。有人可以告诉我我在这里缺少什么吗!
请随时更正问题/内容/标签,以便联系合适的人。
作为解决方法,您可以使用
@Html.Raw("<=")
代替 <=
。
发生这种情况的原因很复杂,所以我会在最后解释。
使用外部JS文件。问题中的
@section
似乎没有必要。您可以在没有它的情况下有条件地渲染脚本。例如
@if (hasPermissions)
{
<script src="path/to/script.js"></script>
}
这是最好的长期解决方案,对于大型项目来说非常值得付出努力,因为:
那么阻止错误的最一致的方法是专门使用
@**@
在视图中使用Razor注释,即使对于JS代码也是如此。这可以通过 VS 的查找和替换功能轻松完成。
如果您也无法做到这一点,那么最不糟糕的解决方法就是简单地反转
if
语句中的条件方向。 (将 <=
更改为 >=
)。如果您使用 for
循环,则可以在终止条件中使用 <
而不是 <=
。
不要使用@Html.Raw("<=")
辅助函数,如其他答案中所述。尽管它最终生成了有效的代码,但它使用 Razor 助手来实现“应该”是纯 JS 的东西。使用此功能会完全禁用同一行的 JS IntelliSense,因此如果您有 JS 语法错误,它不会警告您。 bug什么时候出现? 当满足以下所有条件时:
JS中有一个
<=
=
是标签名称的一部分。
<
<<
、
>
和
>=
不会造成问题。
<text></text>
在
<=
</text>
标签之间有一个 JS 注释(行或块)。剃刀评论没问题。例外情况是:
有问题的评论之前有一个
>
模板字符串文字(例如
`>`
)。
它不能是普通的字符串文字。
<text>
// No problem since > occurs before comment
if (0 <= 1){}
0>0;
// Hello
if (0 <= 1){}
/* This comment breaks it because it happens before the operator */
0>0;
if (0 <= 1){}
@* This is fine *@
0>0;
我只是在循环块之后添加此评论
像这样:
for(let i =0;i<=10;i++){//>//in some where it was working
//your code here
}//>//in some where it was working
您可以通过将条件转换为 JS 来避免使用似乎导致问题的
var condition = @Model.SomeTrueCondition.ToString().ToLower();
if (condition) {
function JSMethod() {
// This statement is no longer a problem if it's not in <text></text>
if ($('#aTextBox').val().length <= 0 || $('#bTextBox').val().length <= 0) {
AnotherJSMethod();
return;
}
}
}