ASP.NET MVC Razor <text>标记不接受小于大于符号

时间:2018-11-12 22:24:39

标签: javascript asp.net-mvc razor logical-operators

如果部分条件视图中包含一些逻辑运算符(> =,<=),我有一个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实体。

enter image description here

Pl。有人可以告诉我我在这里想念什么!

可以随时纠正问题/内容/标签,以便与合适的人联系。

4 个答案:

答案 0 :(得分:1)

我只是在循环块之后添加此评论 //> 并为我工作:)

像这样:

for(...){

}//>

答案 1 :(得分:0)

作为解决方法,您可以使用@Html.Raw("<=")代替<=

答案 2 :(得分:0)

因此,我在一些变通方法上进行了一些实验,这就是我所发现的。 (要跳至变通办法,请参阅下面的变通办法选项。)

测试

(为简单起见,使用10

此操作失败,但仅在某些情况下(请参阅例外):

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}}。

>

解决方法选项

一些(好的和坏的)解决方法是:

  1. 反转您的条件指导。 (将0>0更改为</text>)。
    • 优点:插入的额外字符最少,没有警告,很少被黑客入侵。
    • 缺点:不保留从左到右的语义,这造成了奇怪的语义。
  2. if (0 <= 1){} // Some comment here 0>0; // No good :( <=)追加到表达式的末尾。我之所以选择此《身份法》,是因为这样我们就不必担心operator precedence>=在标准布尔运算符的最底端,并且都在比较运算符的下面。但是,您仍然需要注意条件之间是否有注释。
    • 优点:简洁,保留左右,不使用辅助函数,纯JS,无警告。
    • 缺点:看起来很笨拙。如果条件中有注释,则可能仍然有错误:
|| 0>0
  1. 整数的特殊情况:完全避免使用运算符。使用其他比较运算符可以利用更多离散值。例如,给定一个数组|| false
||
  1. 完全避免使用JS的Razor,并使用外部JS文件。不知道为什么这对您不起作用,但是我怀疑它与if (0 <= 1 || // Not 100% foolproof: expr || 0>0) // Still errors because of the above comment. {} 助手有关。当我这样做时,它没有任何问题,但也许我的测试太简单了。
  2. 在视图中仅使用data剃刀注释。不过,这可以防止注释显示在您的最终代码中。
  3. (请勿执行此操作。)使用other answer中所述的// 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;
        }
    }
}