0

我需要输出如下内容:

<tbody>
   <tr>
     <td>1</td>
     <td>Item1name
        <dd>subitem1name
        <dd>subitem2name
     <td>123</td>
     <td>10</td>
     <td>1230</td>
   </tr>
   <tr>
     <td>2</td>
     <td>Item2name
        <dd>subitem1name
     <td>1234</td>
     <td>10</td>
     <td>12340</td>
   </tr>
</tbody>

我正在使用这个模板:

<tbody>
    @for(int i = 0; i < @Model.ItemsCount; i++) {
        <tr>
            <td>@(i+1)</td>
            <td>
            @Model.Items[i].Name;
            int j = 0;
            for(; j < Model.Items[i].SubCount; j++) {
                <dd>@(Model.Items[i].Sub[j].Name)
            }
            </td>
            <td>@Model.Items[i].CountStr</td>
            <td>@Model.Items[i].CostStr</td>
            <td>@Model.Items[i].TotalStr</td>
        </tr>
    }         
</tbody>

我的课程:

public class Item
{
    public List<SubItem> Sub { get; set; } 
    public string CountStr { get; set;}
    public string CostStr {get; set; }
    public string TotalStr { get; set; }
    public int SubCount {get { return Sub.Count; }}
}
public class SubItem
{
    public string Name { get; set; }
}

尝试解析时出现异常。它说j在当前上下文中不存在。我不知道如何使它正确。

4

3 回答 3

0

您的代码的问题在于以下几行:

int j = 0;
for(; j < Model.Items[i].SubCount; j++) {

这些行不被解释为 Razor,而是作为原始文本。这导致变量j没有被声明或定义在行上:

<dd>@(Model.Items[i].Sub[j].Name)

原因是您需要在代码上下文中才能编写 C# 代码。您可以通过使用@符号来做到这一点,但这只会将单个表达式解释为代码。它不会切换到代码上下文。因此,如果要编写多行代码,则不能使用 @ 符号。如果你想这样做,你需要使用大括号输入代码上下文,前面带有 @ 符号:@{ }

试试这个:

<tbody>
    @for(int i = 0; i < @Model.ItemsCount; i++) {
        <tr>
            <td>@(i+1)</td>
            <td>
            @Model.Items[i].Name
            @{
                int j = 0;
                for(; j < Model.Items[i].SubCount; j++) {
                    <dd>@(Model.Items[i].Sub[j].Name)
                }
            }
            </td>
            <td>@Model.Items[i].CountStr</td>
            <td>@Model.Items[i].CostStr</td>
            <td>@Model.Items[i].TotalStr</td>
        </tr>
    }         
</tbody>

或者,您可以在循环中声明和初始化j变量,并通过在循环前面加上一个符号for来告诉 Razor 编译器该循环是代码。像这样:for@

<tbody>
    @for(int i = 0; i < @Model.ItemsCount; i++) {
        <tr>
            <td>@(i+1)</td>
            <td>
            @Model.Items[i].Name
            @for(int j = 0; j < Model.Items[i].SubCount; j++) {
                <dd>@(Model.Items[i].Sub[j].Name)
            }
            </td>
            <td>@Model.Items[i].CountStr</td>
            <td>@Model.Items[i].CostStr</td>
            <td>@Model.Items[i].TotalStr</td>
        </tr>
    }         
</tbody>

我建议您遵循最后一个示例。

您可以查看Phil Haack 的 Razor 快速参考,了解 Razor 语法如何工作的一些示例。

<dd>顺便说一句,如果标签在<dt>列表之外,那么它是无效的 HTML 。因此,您可能需要重新考虑您的 HTML 结构。您可以阅读MDN<dd>上标签上的文档。

于 2014-02-23T23:40:46.167 回答
0

问题是<dd/>必须关闭,而不仅仅是<dd>. 下面的代码工作正常

<tbody>
        @for(int i = 0; i < @Model.ItemsCount; i++) {
            <tr>
                <td>@(i+1)</td>
                <td>@Model.Items[i].Name
                @for (int j = 0; j < Model.Items[i].SubCount; j++) {
                    <dd/>@Model.Items[i].Sub[j].Name
                }
                </td>
                <td>@Model.Items[i].CountStr</td>
                <td>@Model.Items[i].CostStr</td>
                <td>@Model.Items[i].TotalStr</td>
            </tr>                
        }            
    </tbody>
于 2014-02-23T22:24:00.197 回答
0

根据您发布的代码,您在子项循环j之外声明变量:for

int j = 0;
for(; j < Model.Items[i].SubCount; j++) {
    <dd>@(Model.Items[i].Sub[j].Name)
}

循环应该是:

for (int j = 0; j < Model.Items[i].SubCount; j++) {
    <dd>@(Model.Items[i].Sub[j].Name)
}
于 2014-02-23T18:50:01.883 回答