我的模型的所有属性在post方法中都为空

时间:2018-12-07 06:14:22

标签: c# html asp.net-mvc

在我的程序中,我具有等级视图:

<html>
<head>
    @{ViewBag.Title = "Rank";}
    <link href="https://fonts.googleapis.com/css?family=Nunito|Raleway|Rubik" rel="stylesheet">
</head>

<body>
    @model List<WebRanker.Models.MatchupModel>
    <h2>Rank your list!</h2>
    <h2 style="font-size: small">Choose your favorite of these two</h2>

    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()

    <div id="rankradio">
        @Html.RadioButtonFor(model => model[0].SelectedItem, Model[0].FirstItem, new { @checked = "checked" })
        <label for="choice1">@Model[0].FirstItem.ItemName</label>
        <br />
        @Html.RadioButtonFor(model => model[0].SelectedItem, Model[0].SecondItem)
        <label for="choice2">@Model[0].SecondItem.ItemName</label>

        <div>
            <button class="btn btn-success btn-large" type="submit">Next</button>
            @Html.ActionLink("Cancel", "Index", "Collection", null, new { @class = "btn btn-danger btn-large" })
        </div>
    </div>
    }
</body>

和在我的控制器中对get / post方法进行排名:

[HttpGet]
public ActionResult Rank(int id)
{
    var service = GetCollectionService();

    if (!TempData.Keys.Contains("matchuplist"))
    {
        TempData["matchuplist"] = service.GetMatchups(id);
    }

    return View(TempData["matchuplist"]);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Rank(MatchupModel matchup)
{
    var service = GetCollectionService();
    TempData["matchuplist"] = matchup.MatchupList.Skip(1);  // Error here
    service.IncreaseItemRankingPoints(matchup.SelectedItem.ItemID);

    return View(matchup.SelectedItem.CollectionID);
}

还有一个名为MatchupModel的模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WebRanker.Data;

namespace WebRanker.Models
{
    public class MatchupModel
    {
        public int ListID { get; set; }
        public Item FirstItem { get; set; }
        public Item SecondItem { get; set; }
        public Item SelectedItem { get; set; }
        public List<MatchupModel> MatchupList { get; set; }
    }
}

当用户选择视图中的单选按钮之一并单击Submit时,我希望它设置模型的SelectedItem属性,然后将其发送到控制器中的post方法。出于某种原因,我的模型的所有属性在到达控制器时都是空的,这导致它在到达TempData["matchuplist"] = matchup.MatchupList.Skip(1);时出现错误System.ArgumentNullException: 'Value cannot be null. Parameter name: source'时中断。

我到处都看过,不知道如何解决。我尝试将Request[string]RadioButton()一起使用,而不是RadioButtonFor(),但这只将模型的类型存储为字符串,而不是实际的模型。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在matchupmodel类中添加一个名为choice的属性,并在Radiobutton()中添加“ [0] .choice”,而不只是“ choice”。在字符串变量中获取该值并将其传递给您的服务