代码之家  ›  专栏  ›  技术社区  ›  RaphaelDDL

C#-在@if中包含未关闭的HTML元素时出现System.Web.HttpParseException错误

  •  2
  • RaphaelDDL  · 技术社区  · 13 年前

    我有一个简单的HTML,根据 topic.IsScheduled 的值 (嘘声) :

    如果为false:

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

    如果为真:

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

    剃刀/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 s内部未关闭 @if 陈述 不是因为缺少打开/关闭括号 。如果我在If中关闭它们,或者简单地用注释整个If @* *@ ,然后它就工作了。

    如何配置为忽略 HttpParse 或者甚至关闭它从而停止解析我的HTML?

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

    2 回复  |  直到 13 年前
        1
  •  2
  •   Michael Liu    13 年前

    通常,HTML元素和Razor代码块必须正确嵌套,所以当解析器进入第二个 </div> 在你的内心 @if ,它认为你忘了结账 } .

    要修复此错误,只需在“额外”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>
    

    这个 @: sequence告诉解析器,行的其余部分是要包含在包含代码块中的内容。

        2
  •  1
  •   Paul Sasik    13 年前

    您的代码看起来不错,但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上经历过各种奇怪的事情,比如在运行时出现空白(或缺少空白)导致异常。

    推荐文章