MVC3 Razor预示着问题

时间:2011-08-25 23:21:48

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

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

    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 个答案:

答案 0 :(得分:4)

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

@{gameID = pick.Game.GameID;}

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

e.g。你可以写:

foreach(var name in Model.UserNames) {

答案 1 :(得分: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 syntax reference

答案 2 :(得分: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>