ASP.NET MVC Razor <text>标签不接受小于或等于运算符

问题描述 投票:0回答:4

我有一个 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.

enter image description here

Pl。有人可以告诉我我在这里缺少什么吗!

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

javascript asp.net-mvc razor comparison-operators
4个回答
9
投票

作为解决方法,您可以使用

@Html.Raw("<=")
代替
<=


4
投票

发生这种情况的原因很复杂,所以我会在最后解释。

不要在 Razor 视图中使用 JS

使用外部JS文件。问题中的

@section
似乎没有必要。您可以在没有它的情况下有条件地渲染脚本。例如

@if (hasPermissions)
{
   <script src="path/to/script.js"></script>
}

这是最好的长期解决方案,对于大型项目来说非常值得付出努力,因为:

  • 这使您的脚本不引人注目。因此,捆绑器、TypeScript、npm 包等更易于使用。
  • 这迫使您更好地组织代码。

由于某种原因,如果你不能这样做......

那么阻止错误的最一致的方法是专门使用

@**@
在视图中使用Razor注释,即使对于JS代码也是如此。这可以通过 VS 的查找和替换功能轻松完成。

如果您也无法做到这一点,那么最不糟糕的解决方法就是简单地反转

if
语句中的条件方向。 (将
<=
更改为
>=
)。如果您使用
for
循环,则可以在终止条件中使用
<
而不是
<=

不要使用@Html.Raw("<=")

辅助函数,如
其他答案中所述。尽管它最终生成了有效的代码,但它使用 Razor 助手来实现“应该”是纯 JS 的东西。使用此功能会完全禁用同一行的 JS IntelliSense,因此如果您有 JS 语法错误,它不会警告您。 bug什么时候出现?

当满足以下所有条件时:

JS中有一个

<=
    (小于等于)运算符。它可能认为
  • =
     是标签名称的一部分。
    
    <
    • <<
      >
      >=
      不会造成问题。
      
      
    • 脚本位于
    <text></text>
  • 上下文中
  • <=
  • 和结束
  • </text>
     标签之间有一个 JS 注释(行或块)。剃刀评论没问题。例外情况是:
    
    有问题的评论之前有一个 
    >
      运算符
    • or
       模板字符串文字(例如 
      `>`)。
      它不能是普通的字符串文字。
    示例
(所有这些都在

<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;
    
我只是在循环块之后添加此评论

3
投票
并为我工作:)

像这样:

for(let i =0;i<=10;i++){//>//in some where it was working //your code here }//>//in some where it was working

您可以通过将条件转换为 JS 来避免使用似乎导致问题的 

0
投票
块。例如:

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


© www.soinside.com 2019 - 2024. All rights reserved.