MVC3 Razor 语法困扰

8

我想使用 Razor 语法在 MVC3 中制作一个非常简单的视图,但似乎我无法得到正确的语法。

我有一个像这样简单的表格

<table>
                <tr>
                    @{
                        var counter = 0;
                    }

                    @foreach (var category in ViewBag.Categories)
                    {
                        counter++;
                        <td>
                            <input type="checkbox" checked="checked" name="@("category" + category.Code)" />
                            @category.Description
                        </td>

                        if (counter % 2 == 0)
                        {
                            </tr>
                            <tr>
                        }
                    }
                </tr>
            </table>

当我在if语句中插入和时,出现如下错误:

using块缺少闭合的“}”字符。

如果我尝试将这两个标签包装在和
中,则会出现以下错误:

“tr”元素未关闭。

3个回答

14

你的</tr><tr>破坏了HTML和代码混合的“流程”。

你在不同的层级关闭了tr标签,但这并不是在HTML中的不同层级,而是在代码内部。你应该欺骗Razor输出HTML,而不是解析它自己。

你可以像这样包含它们:

@:</tr><tr>
或者
@Html.Raw("</tr><tr>")

结果:

                        if (counter % 2 == 0)
                        {
                            @:</tr><tr>
                        }

点击查看Haack的Razor语法速查表


1
除了Phil的快速参考资料,我很想有一个完整的参考资料。 - Martin Buberl
@Martin:是啊,我也是这么觉得。虽然语法很简单,但使用起来非常方便和舒适。 - GvS
2
我在想这是否适合作为社区维基的一部分?我真的很需要它。即使Razor语法非常简洁,有时也会让我感到困惑。 ;) - Martin Buberl

3
我会说你在if语句前面缺少@。尝试 @if(counter % 2 == 0)
希望有所帮助。
更新
我检查了一下,GvS的答案似乎完全可行。if语句不需要@。
@for (int i = 0; i < 5; i++)
{
    if (i == 3)
    {
        @:</tr><tr>
    }
}

为什么?他直接在Razor代码块内部,没有被标签包围。if应该可以在没有@的情况下工作。 - GvS
由于内容混杂,无法进行翻译。 - jgauffin
@GvS:我已经检查过了,你是正确的。@:</tr><tr>可以正常工作。 - Martin Buberl
jfauffin:但他已经在<td>标签外面了。所以他回到了代码级别。Razor可以理解没有@的if语句。(至少在我的电脑上)。 - GvS

0

你在 foreach 中混合使用了 HTML 和代码,这就是为什么会出现问题的原因。

要么在 HTML 周围使用 <text></text> 块,要么按照以下方式操作:

<table>
    <tr>
        @{
            var counter = 0;
        }

        @foreach (var category in ViewBag.Categories)
        {
            @{ 
                counter++; 
            }

            <td>
                <input type="checkbox" checked="checked" name="@("category" + category.Code)" />
                @category.Description
            </td>

            @if (counter % 2 == 0)
            {
                </tr>
                <tr>
            }
        }
    </tr>
</table>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接