我需要输出类似的内容:
<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
。我无法弄清楚如何做对。
答案 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>
标记上的文档。