【问题标题】:MVC3 Razor foreach problemsMVC3 Razor foreach 问题
【发布时间】:2011-08-25 23:21:48
【问题描述】:

我有一个模型,它为可变数量的用户返回一个 IEnumerable 的足球选秀权。因此,我正在动态构建一个包含可变列数的 html 表。基本上,我的选择会像这样回来。但是,每个用户都会重复每个游戏,所以我只添加每个表行的前 3 列一次,然后只添加一个标签,直到 gameID 更改。我知道可能有更好的方法可以做到这一点,但这只是我需要快速完成的一个副项目。而且,我只是想弄清楚为什么它不起作用。

    GameID
    GameDateTimeDisplay
    GameTeamDisplay
    WinningTeamDisplay
    PickedTeamAbbr

好的,所以这是行不通的精神错乱。我可以成功创建表头,但是 tbody 不工作,但它在一个奇怪的地方出错。

我不得不把所有 @Html.Raw(...) 的东西放在那里,因为找不到 foreach 和 if 语句的结束标签时遇到了麻烦。

无论如何,这是我的代码。导致异常的行是这样的: @gameID = @pick.Game.GameID;

例外是 --> 编译器错误消息:CS1525: Invalid expression term '=' 智能感知将@gameID 显示为变量,@pick.Game.GameID 似乎也是正确的。

<table>
        <thead>
            <tr>
            <th>Game</th>
            <th>Game Date/Time</th>
            <th>Winner</th>
            @foreach(var name in @Model.UserNames) { 
                <th>@name</th>   
            }
            </tr>
        </thead>
        <tbody>
            @{
            int lastGameID = 0;
            int gameID = 0;
            bool firstGame = true;
            }

            @foreach(var pick in @Model.Picks) {
                @gameID = @pick.Game.GameID;
                if(@gameID != @lastGameID) { 
                    if(!@firstGame){
                        <text>@Html.Raw("</tr>")</text>
                    }
                    @Html.Raw(
                    <tr> 
                        <td>@pick.GameTeamDisplay</td>
                        <td>@pick.GameDateTimeDisplay</td>
                        <td>@pick.Game.WinningTeam.TeamAbbr</td>
                        <td>@pick.PickedTeamAbbr</td>             
                    )

                }
                else {
                    @Html.Raw(<td>@pick.PickedTeamAbbr</td>)
                }
            }    
            @Html.Raw(</tr>)

        </tbody>
    </table>

更新: 我已经删除了@Html.Raw 等...还将游戏ID 分配包装在@{} 中。它现在在这条线上给了我一个错误, @{gameID = @pick.Game.GameID;}

编译错误:CS1501:方法 'Write' 没有重载需要 0 个参数

这是更新后的代码:

    @foreach(var pick in @Model.Picks) {
        @{gameID = @pick.Game.GameID;}
        if(@gameID != @lastGameID) { 
            if(!@firstGame){
                @:</tr>
            }

            @:<tr> 
                <td>@pick.GameTeamDisplay</td>
                <td>@pick.GameDateTimeDisplay</td>
                <td>@pick.Game.WinningTeam.TeamAbbr</td>
                <td>@pick.PickedTeamAbbr</td>             
        }
        else {
            <td>@pick.PickedTeamAbbr</td>
        }
    }    
    </tr>

【问题讨论】:

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


    【解决方案1】:

    您需要用{ } 将其包围以使其成为代码块

    @{gameID = pick.Game.GameID;}
    

    此外,您不需要在 foreach/if 语句中使用 @,因为它们是代码块。

    例如你可以写:

    foreach(var name in Model.UserNames) {
    

    【讨论】:

    • 我添加了它并解决了这个问题,然后它就在线上炸了,@Html.Raw(.... 现在告诉我“
    【解决方案2】:

    随便写

              @foreach(var pick in Model.Picks) {
                    <tr> 
                        <td>@pick.GameTeamDisplay</td>
                        <td>@pick.GameDateTimeDisplay</td>
                        <td>@pick.Game.WinningTeam.TeamAbbr</td>
                        <td>@pick.PickedTeamAbbr</td>             
                    </tr>
            }
    

    您不需要在代码块中使用@。您可以使用@: 代替&lt;text&gt;, Html.Raw
    你可以在这里看到Razor syntax reference

    【讨论】:

      【解决方案3】:

      我确定我的 Razor 视图代码太复杂了。真正的问题是我试图强制一个视图与我为另一个视图创建的模型一起工作。我最终为这个视图创建了更多模型。代码更干净,最棒的是它的工作原理!这是我最终得到的代码。

          <table>
              <thead>
                  <tr>
                  <th>Game</th>
                  <th>Game Date/Time</th>
                  <th>Winner</th>
                  @foreach(var name in @Model.UserNames) { 
                      <th>@name</th>   
                  }
                  </tr>
              </thead>
              <tbody>
                 @foreach(var game in @Model.Games) { 
                      <tr>
                          <td>@game.GameDescription</td>                    
                          <td>@game.GameDisplayDateTime</td>                    
                          <td>@game.GameWinner</td>                    
                          @foreach(var pick in game.GamePicks){
                              <td>@pick.PlayerPick</td>   
                          }                   
                      </tr>               
                 }
              </tbody>
          </table>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多