【问题标题】:Razor Missing Matching Closing TagRazor 缺少匹配的结束标记
【发布时间】:2012-08-14 09:38:18
【问题描述】:

我对相当复杂的表格和 Razor 标签有一些问题。

我取出了最“@”。 (例如在 if 等前面)。

我玩了大约 30 分钟,但似乎找不到方法。我总是会收到/或类似没有任何结束标签的错误。我玩过@: 等等,但就是不明白。

如果有人可以帮助我,如果有人可以对 @: 标签给出一个体面的解释,我将非常感激。

<div>
    if (Model.dsInfoUser.Tables[0].Rows.Count != 0)
    {
        <table>
            for (int i = 0; i < Model.dsInfoUser.Tables[0].Rows.Count; i++)
            {
                if (i % 2 == 1)
                {
                    <tr class="tableEven">
                }
                else
                {
                    <tr class="tableOdd">
                }
                    @*Picture*@
                    if (i == 0)
                    {
                        <td rowspan="@Model.dsInfoUser.Tables[0].Rows.Count" class="tblPicture"><img src="@Model.dsInfoUser.Tables[0].Rows[i][1]" /></td>
                    }
                    <td>
                        @Model.dsInfoUser.Tables[0].Rows[i][0].ToString()
                    </td> 
                    <td>
                        @Model.dsInfoUser.Tables[0].Rows[i][1].ToString()
                    </td> 
                </tr> 
                if (i == 5)
                {
                    <tr>
                        <td>
                            <text>Member Of:</text>
                        </td>
                            <td>
                                <table>
                                    for (int j = 0; j < Model.dsInfoUser.Tables[1].Rows.Count; j++)
                                    {
                                    if (j % 2 == 1)
                                    {
                                        <tr class="tableEven">
                                    }
                                    else
                                    {
                                        <tr class="tableOdd">
                                    }
                                        <td rowspan="3">
                                            <div style="width: 400px; overflow-y: scroll">

                                            </div>
                                        </td>
                                    </tr>
                                </table>
                            </td>
                    </tr>
                }
        </table>
    }
</div>

对于任何想知道的人,这里是固定版本:

<div>
    @if (Model.dsInfoUser.Tables[0].Rows.Count != 0)
    {
        <table>
            @for (int i = 0; i < Model.dsInfoUser.Tables[0].Rows.Count; i++)
            {
                <tr class="@(i % 2 == 1 ? "tableEven" : "tableOdd")">
                    @if (i == 0)
                    {
                        <td rowspan="@Model.dsInfoUser.Tables[0].Rows.Count" class="tblPicture"><img src="@Model.dsInfoUser.Tables[0].Rows[i][1]" /></td>
                    }
                    <td>
                        @Model.dsInfoUser.Tables[0].Rows[i][0].ToString()
                    </td> 
                    <td>
                        @Model.dsInfoUser.Tables[0].Rows[i][1].ToString()
                    </td> 
                </tr> 
                    if (i == 5)
                    {
                    <tr>
                        <td>
                            <text>Member Of:</text>
                        </td>
                            <td>
                                <table>
                                    @for (int j = 0; j < Model.dsInfoUser.Tables[1].Rows.Count; j++)
                                    {
                                        <tr class="@(i % 2 == 1 ? "tableEven" : "tableOdd")">
                                            <td rowspan="3">
                                                <div style="width: 400px; overflow-y: scroll">
                                                </div>
                                            </td>
                                        </tr>
                                    }
                                </table>
                            </td>
                    </tr>
                    }
            }
        </table>
    }
</div>

【问题讨论】:

标签: c# html asp.net-mvc razor html-table


【解决方案1】:

你不能那样做。 Razor 期望具有适当的层次结构。特别是,这是非法的:

if(condition)
{
    <foo>
}
else
{
    <foo>
}
</foo>

尽管我们都知道这将是一个格式良好的&lt;foo&gt;&lt;/foo&gt;,但 razor 并不这么认为。它看到 2 个未关闭的 &lt;foo&gt; 和一个完全不相关的 &lt;/foo&gt; 不知从何而来。

在你的情况下,这样做的方法是:

<tr class="@(i % 2 == 1 ? "tableEven" : "tableOdd")">
   <td>...</td>
</tr>

【讨论】:

  • 这是 Razor IMO 中的一个缺陷。我不希望 Razor 能够推理复杂的逻辑,但是在这里第一个块或第二个块将(无条件地)运行,因此它应该能够理解。 PhpStorm 可以通过这种方式对定义的变量进行推理,所以 Razor 应该也可以。
  • @Mark 您确定 PhpStorm 不只是 更简单 并在其分支时遵循逻辑,只是按照每个分支中的指示进行操作? IE。不是真的搞清楚什么,只是听话?
  • 有什么区别?如果只有一个分支定义了变量,它会说“可能未定义的变量”,但如果它们都有它,那么它不会发出警告。随心所欲地称呼它,但这是明智的行为。
  • @Mark 确实,razor 会为“明确分配”这样做,但我怀疑 declaration 会相应地限定范围。不同的语言,不同的政策。
  • 我不明白。标签将肯定在这里匹配,那么为什么它不能抑制错误呢?这是一个设计决策,还是解析器根本没有那么复杂(还)?
【解决方案2】:
if (i % 2 == 1)
{
    <tr class="tableEven">
}
else
{
    <tr class="tableOdd">
}

可能是给你带来麻烦的原因

你应该可以改写成

 string className = i%2 == 1 ? "tableEven" : "tableOdd"
 <tr class="@className">

让解析器开心

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多