MVC3 Razor中的foreach问题

3
我有一个模型,返回一个可变数量用户的足球比赛选择的IEnumerable。因此,我正在动态构建一个具有可变数量列的HTML表格。基本上,我的选择会像这样返回。但是,每场比赛将为每个用户重复,因此我只在每个表行中添加前3列一次,然后仅添加单个标签,直到游戏ID更改。我知道可能有更好的方法来解决这个问题,但这只是一个需要快速完成的小项目。我只想弄清楚为什么它不起作用。
    GameID
    GameDateTimeDisplay
    GameTeamDisplay
    WinningTeamDisplay
    PickedTeamAbbr

好的,这里是不起作用的疯狂代码。我可以成功创建表头,但是tbody没有工作,并且在一个奇怪的地方出错。

我不得不把所有的@Html.Raw(...)都放在那里,因为没有它们,它无法找到foreach和if语句的结束标记。

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

异常是-->编译器错误消息:CS1525:无效的表达式项“=” Intellisense显示@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等内容...并且在@{}中包装了gameID赋值。现在它在这一行上给我一个错误, @{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>
3个回答

4
您需要将其用{ }包围起来,以使其成为代码块。
@{gameID = pick.Game.GameID;}

此外,在foreach / if语句中不需要使用@,因为它们是代码块。
例如,您可以直接编写:
foreach(var name in Model.UserNames) {

我添加了那个并解决了那个问题,然后它在这一行崩溃了,@Html.Raw(<tr>....现在告诉我"<"是无效字符。我删除了@Html.Raw,现在又告诉我我的foreach没有闭合括号。 - Jeff Reddy

4

只需编写

          @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>
        }

你不需要在代码块内使用@。你可以使用@:代替<text>, Html.Raw
你可以在这里看到Razor语法参考

2

我发现我的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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接