簡體   English   中英

如何正確地將Ienumerable <>或List <>對象傳遞給我的發布操作?

[英]How do I correctly pass my Ienumerable<> or List<> object to my post action?

我顯然做錯了什么,但我似乎無法弄清楚。 我試圖將對象列表傳遞給我的后動作控制器,但是我得到的對象引用未設置為對象的實例。 我提交表單時出錯。 我使用了提琴手來驗證請求是否確實包含對象,但沒有使它進入后期操作。

我的模特:

public class MakeNbaPickVm
{

    public List<NbaGamesForPicksVm> NbaGames { get; set; }


    public pick_UserPicks Pick { get; set; }


    public bool PickSpreadIsFavAway { get; set; }
    public bool PickSpreadIsFavHome { get; set; }
    public bool PickSpreadIsDogAway { get; set; }
    public bool PickSpreadIsDogHome { get; set; }
    public bool OUpickIsOVer { get; set; }
    public bool OUpickIsUnder { get; set; }
    public decimal LineOdds { get; set; }
    public decimal OuOdds { get; set; }
    public decimal LineBet { get; set; }
    public decimal OuBet { get; set; }
    public int MatchId { get; set; }
}

我的視圖顯示正常:

@model IEnumerable<MakeNbaPickVm>

@{
ViewBag.Title = "Make Nba Picks";
}

<h2>Make Nba Picks</h2>

@using(Html.BeginForm("MakeNbaPick", "Picks", FormMethod.Post))
{
<table class="PickTable">
    <tr>
        <th>Game Date</th>
        <th>Away</th>
        <th>Away Line</th>
        <th>Over/Under</th>
        <th>Home</th>
        <th>Home Line</th>
        <th>O/U Odds</th>
        <th>O/U Bet</th>
        <th>Line Odds</th>
        <th>Line Bet</th>
    </tr>
    @{
        int modLevel = 0;
    }
    @foreach(var game in Model)
    {
        foreach (var match in game.NbaGames)
        {
            @Html.HiddenFor(x => x.ElementAt(modLevel).MatchId, new {@Value = 
       match.Game.Id})
            <tr>
                <td>@match.Game.GameDateTime.Value.ToShortDateString() 
                    @match.Game.GameDateTime.Value.ToShortTimeString()
                </td>
                <td>@match.Away</td>
                @if(match.Game.Away == match.Game.FavoriteTeam)
                {
                    <td>
                        @match.Game.FavoriteSpread<br/> @Html.CheckBoxFor(x => 
                                                                          x.ElementAt(modLevel)
                                                                          .PickSpreadIsFavAway)
                    </td>
                }
                else
                {
                    <td>
                        @match.Game.UnderDogSpread<br/> @Html.CheckBoxFor(x => 
                                                                          x.ElementAt(modLevel)
                                                                          .PickSpreadIsDogAway)
                    </td>
                }
                <td>
                    @match.Game.OverUnder<br/> Over @Html.CheckBoxFor(x => 
                                                                      x.ElementAt(modLevel)
                                                                          .OUpickIsOVer)<br/>
                    Under @Html.CheckBoxFor(x => x.ElementAt(modLevel)
                                                     .OUpickIsUnder)
                </td>
                <td>@match.Home</td>
                @if(match.Game.Home == match.Game.FavoriteTeam)
                {
                    <td>
                        @match.Game.FavoriteSpread<br/> @Html.CheckBoxFor(x => 


                                                  x.ElementAt(modLevel).PickSpreadIsFavHome)
                    </td>
                }
                else
                {
                    <td>
                        @match.Game.UnderDogSpread<br/> @Html.CheckBoxFor(x => 
                                                                          x.ElementAt(modLevel)

                                                                         .PickSpreadIsDogHome)
                    </td>
                }
                <td>@Html.TextBoxFor(x => x.ElementAt(modLevel).OuOdds, 
                                     new {@class="PickOddsBet"})</td>
                <td>@Html.TextBoxFor(x => x.ElementAt(modLevel).OuBet,
                                     new {@class="PickOddsBet"})</td>
                <td>@Html.TextBoxFor(x => x.ElementAt(modLevel).LineOdds,
                                     new {@class="PickOddsBet"})</td>
                <td>@Html.TextBoxFor(x => x.ElementAt(modLevel).LineBet,
                                     new {@class="PickOddsBet"})</td>
            </tr>
            modLevel++;
        }

    }
</table>

<input type="submit"/>
}

我的post操作在foreach語句中返回錯誤:

[HttpPost]
    public ActionResult MakeNbaPick(List<MakeNbaPickVm> vM)
    {
        // Save the picks to db
        foreach (var pickVm in vM)
        {
           // code doesn't make it this far
        }

        return RedirectToAction("Games");
    }

為了使模型綁定正確進行,文本框的名稱必須采用正確的格式。

我認為以下是您要查找的內容: 在ASP.NET MVC POST中進行模型綁定IEnumerable?

好的,這是我的問題的解決方案。 ajp,您為我指明了正確的方向。 我必須將List而不是IEnumerable返回到視圖,以便可以訪問index []。 這是我對該視圖的更新代碼:

@model List<MakeNbaPickVm>

@{
ViewBag.Title = "Make Nba Picks";
}

<h2>Make Nba Picks</h2>

@using(Html.BeginForm("MakeNbaPick", "Picks", FormMethod.Post))
{
<table class="PickTable">
    <tr>
        <th>Game Date</th>
        <th>Away</th>
        <th>Away Line</th>
        <th>Over/Under</th>
        <th>Home</th>
        <th>Home Line</th>
        <th>O/U Odds</th>
        <th>O/U Bet</th>
        <th>Line Odds</th>
        <th>Line Bet</th>
    </tr>
    @{
        int modLevel = 0;
    }
    @foreach(var game in Model)
    {
        foreach (var match in game.NbaGames)
        {
            @Html.HiddenFor(x => x[modLevel].MatchId, new {@Value = 
       match.Game.Id})
            <tr>
                <td>@match.Game.GameDateTime.Value.ToShortDateString() 
                    @match.Game.GameDateTime.Value.ToShortTimeString()
                </td>
                <td>@match.Away</td>
                @if(match.Game.Away == match.Game.FavoriteTeam)
                {
                    <td>
                        @match.Game.FavoriteSpread<br/> @Html.CheckBoxFor(x => 
                                                                          x[modLevel]
                                                                          .PickSpreadIsFavAway)
                    </td>
                }
                else
                {
                    <td>
                        @match.Game.UnderDogSpread<br/> @Html.CheckBoxFor(x => 
                                                                          x[modLevel]
                                                                      .PickSpreadIsDogAway)
                    </td>
                }
                <td>
                    @match.Game.OverUnder<br/> Over @Html.CheckBoxFor(x => 
                                                                      x[modLevel]
                                                                          .OUpickIsOVer)<br/>
                    Under @Html.CheckBoxFor(x => x[modLevel]
                                                     .OUpickIsUnder)
                </td>
                <td>@match.Home</td>
                @if(match.Game.Home == match.Game.FavoriteTeam)
                {
                    <td>
                        @match.Game.FavoriteSpread<br/> @Html.CheckBoxFor(x => 
                                                                x[modLevel].PickSpreadIsFavHome)
                    </td>
                }
                else
                {
                    <td>
                        @match.Game.UnderDogSpread<br/> @Html.CheckBoxFor(x => 
                                                                          x[modLevel]
                                                                       .PickSpreadIsDogHome)
                    </td>
                }
                <td>@Html.TextBoxFor(x => x[modLevel].OuOdds, 
                                     new {@class="PickOddsBet"})</td>
                <td>@Html.TextBoxFor(x => x[modLevel].OuBet,
                                     new {@class="PickOddsBet"})</td>
                <td>@Html.TextBoxFor(x => x[modLevel].LineOdds,
                                     new {@class="PickOddsBet"})</td>
                <td>@Html.TextBoxFor(x => x[modLevel].LineBet,
                                     new {@class="PickOddsBet"})</td>
            </tr>
            modLevel++;
        }

    }
</table>

<input type="submit"/>
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM