在嵌套条件语句中混合使用HTML和Razor代码

时间:2015-03-10 20:39:30

标签: c# asp.net-mvc-3 razor

我正在尝试使用一些嵌套条件的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>   

2 个答案:

答案 0 :(得分:2)

  • 您不需要在Razor块中的DOM元素之前/之后放置@;(即@{ })。 这里有一个很好的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>
    }
}

答案 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()。