【问题标题】:How do I correctly pass my Ienumerable<> or List<> object to my post action?如何正确地将我的 Ienumerable<> 或 List<> 对象传递给我的 post 操作?
【发布时间】:2013-01-01 03:29:31
【问题描述】:

我显然做错了什么,但我似乎无法弄清楚。我正在尝试将我的对象列表传递给我的后操作控制器,但是我收到一个 Object reference not set to an instance of an object. 提交表单时出错。我使用 fiddler 来验证请求确实包含对象,但它没有进入 post 操作。

我的模特:

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"/>
}

以及我在 foreach 语句中返回错误的 post 操作:

[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");
    }

【问题讨论】:

  • 在黑暗中拍摄,尝试将ActionResult MakeNbaPick(List&lt;MakeNbaPickVm&gt; vM) 改为IEnumerable&lt;MakeNbaPickVm&gt;?或者只是一个FormCollection

标签: c# asp.net-mvc razor


【解决方案1】:

要正确进行模型绑定,文本框的名称需要采用正确的格式。

我认为您正在寻找以下内容: Modelbinding IEnumerable in ASP.NET MVC POST?

【讨论】:

    【解决方案2】:

    好的,这是我的问题的解决方案。 ajp,你给我指出了正确的方向。我必须将一个列表而不是一个 IEnumerable 返回到视图中,这样我才能访问索引 []。这是我更新的视图代码:

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

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2012-01-25
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2014-06-24
      相关资源
      最近更新 更多