在嵌套条件中混合 HTML 和 Razor 代码

Mixing HTML and Razor Code Within Nested Conditionals

我正在尝试将 Razor 与一些嵌套条件一起使用,这是迄今为止 Razor 和 HTML 迄今为止我尝试过的最复杂的混合,我承认我还不是 Razor 的专家.我遇到这种类型的 Razor 解析错误:"Only assignment,call,decrement,increment, etc, can be used as a statement..."

似乎我使用了太多的“@”,但如果我在此处删除它@,我会收到更多错误,提示需要一个语句并且符号 "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>   

只有在使用 .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
}

此外,您没有关闭 table 行标记,这可能会引发您看到的一些额外错误。

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().

  • 您不需要将 @; before/after DOM 元素放入您的 Razor 块中(即 @{ } )。 这里有一个很好的 link 来理解如何在代码块中组合文本、标记和代码
  • 要循环 attendance 中的每个项目,您需要使用 for 循环(如果不需要递增计数器,则使用 foreach 循环)。
  • 缺少最后一个 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>
            @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>
    }
}