如果部分条件视图中包含一些逻辑运算符(> =,<=),我有一个JavaScript。该JavaScript被MVC剃刀标记包围(基于Model值有条件地加载JS内容)。
有了这个,我的JS根据Model属性动态加载。但是,如果我在JavaScript方法中包含逻辑运算符,则会引发错误。
工作场景,
@if (Model.SomeTrueCondition)
{
<text>
function JSMethod() {
AnotherJSMethod();
return;
}
</text>
}
无法正常工作的情况(如果我使用逻辑运算符调用AnotherJSMethod()
)
@if (Model.SomeTrueCondition)
{
<text>
function JSMethod() {
//This if condition containing logical 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&lt / p>”)。如果要显示“ <”字符,请使用“ <” HTML实体。
Pl。有人可以告诉我我在这里想念什么!
可以随时纠正问题/内容/标签,以便与合适的人联系。
答案 0 :(得分:1)
我只是在循环块之后添加此评论 //>
并为我工作:)
像这样:
for(...){
}//>
答案 1 :(得分:0)
作为解决方法,您可以使用@Html.Raw("<=")
代替<=
答案 2 :(得分:0)
因此,我在一些变通方法上进行了一些实验,这就是我所发现的。 (要跳至变通办法,请参阅下面的变通办法选项。)
(为简单起见,使用1
和0
)
此操作失败,但仅在某些情况下(请参阅例外):
if (0 <= 1){} // HttpParse Error
但是所有这些都起作用:
if (1 >= 0){} // Greater or equal to
if (0 < 1 || 0 === 1){} // Less than
if (1 > 0 || 1 === 0){} // Greater than
if (1 << 0){} // FYI, even the left-shift doesn't cause problems.
结论:此问题似乎是<=
(小于或等于)运算符所独有的。它必须认为=
是标记名或其他名称的一部分。
在进一步测试中,我还发现仅 发生在<text></text>
上下文中,并且在<=
和结尾{{ 1}}标签。 (可以使用剃刀发表评论。)例如:
</text>
如果在结束@{
<text>
1<=0;
// Remove this comment and the error goes away.
@* No problems with this comment *@
</text>
}
之前的某个字符串文字中有任何>
不在后面,则不会发生错误。也就是说,</text>
,>
,>=
,>>
,>>>
或>>=
运算符都将使错误无效。
>>>=
老实说,这很有趣。 MVC视图甚至输出正确的代码。我只能得出结论,这是一个错误。
如果// No problem:
if (0 <= 1){}
0>'something unrelated';
和<=
之间的任何地方都没有评论,则此操作无效,因此,遗憾的是,我们不能仅在{{ 1}}。
>
一些(好的和坏的)解决方法是:
0>0
更改为</text>
)。
if (0 <= 1){}
// Some comment here
0>0; // No good :(
(<=
)追加到表达式的末尾。我之所以选择此《身份法》,是因为这样我们就不必担心operator precedence。 >=
在标准布尔运算符的最底端,并且都在比较运算符的下面。但是,您仍然需要注意条件之间是否有注释。
|| 0>0
|| false
:||
if (0 <= 1 ||
// Not 100% foolproof:
expr ||
0>0) // Still errors because of the above comment.
{}
助手有关。当我这样做时,它没有任何问题,但也许我的测试太简单了。data
剃刀注释。不过,这可以防止注释显示在您的最终代码中。// Array lengths are always integers:
if (data.length < 1){}
// Or since they are also always positive:
if (data.length === 0){}
帮助函数。尽管事实上它最终会生成有效的代码,但它使用Razor帮助程序处理应为纯JS的内容,并在Intellisense中使用 提出错误警告 ,因为该表达式不会看起来对解析器有效。答案 3 :(得分:0)
您可以通过将您的条件转换为 JS 来避免使用似乎会导致问题的 <text>
块。例如:
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;
}
}
}