我正在尝试使用一些嵌套条件的Razor,这是迄今为止我尝试过的Razor和HTML最复杂的混合,我承认我还不是Razor的专家。我得到Razor解析这种类型的错误:“只有赋值,调用,减量,增量等,可以用作语句......”
好像我使用了太多“@”但是如果我在这里删除它@< td>我得到更多的错误,声明是预期的,符号“td”无法解决。我认为Razor足够聪明,知道什么时候在代码块中呈现HTML?我显然没有给Razor提供它所需要的东西。
第一次解析错误发生在"@<td rowspan="@total">N/A</td>;"
@foreach (var customerId in customerIds)
{
var attendance = records.Where(x => customerIds.Contains(x.Customer.CustomerId)).ToList();
var total = attendance.Count();
if (total > 0)
{
<tr>
@{
var i = 0;
attendance.ForEach(x =>
{
if (i == 0)
{
@<td rowspan="@total">@x.Customer.CustomerFullName</td>;
@<td rowspan="@total">N/A</td>;
}
@<td>@x.Event.EventTitle</td>;
@<td>@x.AttendanceStartDate.ToString("MM/dd/yy")</td>;
@<td style="width: 10%; text-align: center">
}
}
}
}
</tr>
答案 0 :(得分:2)
@
和;
(即@{ }
)。
这里有一个很好的link来理解如何在代码块中组合文本,标记和代码attendance
中的每个项目,您需要使用for
循环(或foreach
循环,如果您不需要递增计数器)。你可以试试这个:
foreach (var customerId in customerIds)
{
var attendance = records.Where(x => customerIds.Contains(x.Customer.CustomerId)).ToList();
var total = attendance.Count();
if (total > 0)
{
<tr>
@for (var i = 0; i < total; i++)
{
var x = attendance[i];
if (i == 0)
{
<td rowspan="@total">@x.Customer.CustomerFullName</td>
<td rowspan="@total">N/A</td>
}
<td>@x.Event.EventTitle</td>
<td>@x.AttendanceStartDate.ToString("MM/dd/yy")</td>
<td style="width: 10%; text-align: center"></td>
}
</tr>
}
}
答案 1 :(得分:1)
当你使用.NET时,你只需要@符号; HTML不应该包含@符号。从所有<td>
标记中删除它。
这意味着一个.NET块:
@{
int x = 1;
x++;
@: This (@:) breaks out of .NET and says that this text is plain HTML
x--; //back to .NET
}
此外,您没有关闭表格行标记,这可能会引发您看到的一些额外错误。
if (total > 0)
{
<tr>
@{
var i = 0;
attendance.ForEach(x =>
{
if (i == 0)
{
<td rowspan="@total">@x.Customer.CustomerFullName</td>;
<td rowspan="@total">N/A</td>;
}
<td>@x.Event.EventTitle</td>;
<td>@x.AttendanceStartDate.ToString("MM/dd/yy")</td>;
<td style="width: 10%; text-align: center">
}
}
编辑:哇,也就是,attendance.ForEach()试图修改考勤对象的每个元素;它不会遍历每个元素。我想你想要另一个foreach循环而不是调用Object.ForEach()。