C# - System.Web.HttpParseException 在@if内具有未关闭的 HTML 元素时出错

本文关键字:HTML 出错 元素 Web System HttpParseException @if | 更新日期: 2023-09-27 18:35:05

我有一个简单的HTML,它会根据topic.IsScheduled的值(bool)而变化:

如果为假:

+-------------------+-------------------+
|     row-fluid                         |
+-------------------+-------------------+
| span6(something1) | span6(something2) |
+-------------------+-------------------+

如果为真:

+-------------------+-------------------+
|     row-fluid                         |
+-------------------+-------------------+
| span6(something1) | span6(something3) |
+-------------------+-------------------+
|     row-fluid                         |
+-------------------+-------------------+
| span6(something2) | span6(something4) |
+-------------------+-------------------+

The razor/cshtml:

<div class="row-fluid">
        <div class="span6">
            something1
        </div>
    @if (topic.IsScheduled){
        <div class="span6">
            something3
        </div>
    </div>
    <div class="row-fluid">
    }
        <div class="span6">
            something2
        </div>
    @if (topic.IsScheduled) {
        <div class="span6">
            something4
        </div>
    }
</div>

但是当我这样做时,我在运行项目时出现以下错误:

System.Web.HttpParseException (0x80004005): The if block is missing a closing "}" character. Make sure you have a matching "}" character for all the "{" characters within this block, and that none of the "}" characters are being interpreted as markup. at 

我已经测试过,C# 给我错误是因为div 语句内没有关闭@if而不是因为缺少左/右括号。如果我在 if 中关闭它们,或者只是用 @* *@ 注释整个 if ,那么它可以工作。

如何配置忽略HttpParse甚至关闭它以停止解析我的 HTML?

是的,我可以制作 if/else,但随后我会重复 HTML 和变量,因为解析器很愚蠢,我想避免这种情况。

C# - System.Web.HttpParseException 在@if内具有未关闭的 HTML 元素时出错

通常,HTML 元素和 Razor 代码块必须正确嵌套,因此当解析器到达@if内的第二个</div>时,它会认为您忘记了结束}

要修复此错误,只需在"额外"HTML 标记前面加上如下所示@:

<div class="row-fluid">
    <div class="span6">
        something1
    </div>
@if (topic.IsScheduled) {
    <div class="span6">
        something3
    </div>
@:</div>
@:<div class="row-fluid">
}
    <div class="span6">
        something2
    </div>
@if (topic.IsScheduled) {
    <div class="span6">
        something4
    </div>
}
</div>

@:序列告诉解析器,该行的其余部分是您希望作为包含代码块的一部分包含的内容。

你的代码看起来不错,但 Razor 布局引擎还没有完全解决所有的问题,而且你的布局/业务逻辑确实有点花哨。也就是说,你试过KISS方法吗?因此:

@if (topic.IsScheduled){
    <div class="row-fluid">
        <div class="span6">something1</div>
        <div class="span6">something3</div>
    </div>
    <div class="row-fluid">
            <div class="span6">something2</div>
            <div class="span6">something4</div>
    </div>
} else {
    <div class="row-fluid">
        <div class="span6">something1</div>
        <div class="span6">something2</div>
    </div>
}

我经历过 Razor 的各种奇怪之处,例如空白(或缺少空格)导致运行时异常。