剃刀:迭代项目和子项目

时间:2014-02-23 15:37:33

标签: razor razorengine

我需要输出类似的内容:

<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。我无法弄清楚如何做对。

3 个答案:

答案 0 :(得分: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)
}

答案 1 :(得分: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>

答案 2 :(得分: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循环是代码,前面加上{{1} }} 标志。像这样:

@

我建议你按照最后一个例子。

您可以查看Phil Haack's Razor quick reference以了解Razor语法如何工作的一些示例。

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