C# 将IEnumerable传递给控制器

C# 将IEnumerable传递给控制器,c#,.net,asp.net-mvc,razor,C#,.net,Asp.net Mvc,Razor,我正在HTTPGet中构建一个IEnumerable,并将其传递给我的视图。我的问题是使用hiddenfor将所选信息返回控制器 [HttpGet] public ActionResult Index(int id) { RANKDModel model = new RANKDModel(); model.thingList = new List<thingsModel>(); List<SelectLis

我正在HTTPGet中构建一个IEnumerable,并将其传递给我的视图。我的问题是使用hiddenfor将所选信息返回控制器

    [HttpGet]
    public ActionResult Index(int id)
    {
        RANKDModel model = new RANKDModel();
        model.thingList = new List<thingsModel>();
        List<SelectListItem> thingRank = new List<SelectListItem>();

        var tblThingGroup = db.tblThingGroup.Where(x => x.thingCollectionID == id).Include(t => t.tblThing).Include(t => t.tblThingCollection).OrderBy(x => x.displayOrder);

        model.thingRank = new SelectList(thingRank, "Value", "Text");

        int i = 1;

        foreach (var thing in tblThingGroup)
        {
            thingRank.Add(new SelectListItem()
            {
                Value = thing.tblThing.thingID.ToString(),
                Text = i.ToString()
            });
            model.thingRank = new SelectList(thingRank, "Value", "Text");

            thingsModel things = new thingsModel();

            things.thingID = thing.tblThing.thingID;
            things.thingName = thing.tblThing.thingName;
            things.thingImgPointer = thing.tblThing.thingImgPointer;

            model.thingList.Add(things);
            i++;
        }

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(RANKDModel model, IEnumerable<SelectListItem> thingRank)
    {
        //check model.Selecteditem
        return View(model);
    }
“我的视图”显示下拉列表,但我似乎无法在Post上将值传回控制器。以下是我的观点。注释行是失败的尝试。我不希望在这里使用ajax。由于我的值和文本字段是我所需要的,我觉得我应该能够将它们传递回控制器,即使它们不是模型的一部分,这很好,但我也没有成功

@using (Html.BeginForm())
{
    <div class="col-md-8">
        @Html.TextBoxFor(modelItem => Model.firstName, new { @class = "form-control" })
        @Html.TextBoxFor(modelItem => Model.lastName, new { @class = "form-control" })
    </div>

    <table class="table">
        @Html.HiddenFor(modelItem => Model.thingRank)

        @for (int i = 0; i < Model.thingList.Count; i++)
        {
            string imagePointer = "/Areas/RANKD/thingImages/" + Model.thingList[i].thingImgPointer;
            <tr>
                <td>
                    @Html.HiddenFor(modelItem => Model.thingList[i].thingID)

                    @Html.DropDownListFor(modelItem => modelItem.thingRank, (IEnumerable<SelectListItem>)ViewBag.thingRank, "Rank it Bro.") @*Model.thingRank.Items as IEnumerable<SelectListItem>)*@

                    @*@Html.HiddenFor(modelItem => modelItem.thingRank[Model.thingRank(i)].Value)*@

                    @Html.HiddenFor(modelItem => modelItem.thingRank[Model.thingRank.IndexOf(i)].Value)

                    @*@Html.HiddenFor(modelItem => modelItem.thingRank)*@

                    @Html.DisplayFor(modelItem => Model.thingList[i].thingName)
                </td>
                <td>
                    <img src="@imagePointer" alt="@Model.thingList[i].thingName" height="75" />
                </td>
            </tr>
        }

    </table>

    <input type="submit" value="RANK IT" class="btn btn-default" />
}
我是不是在我的藏身处遗漏了什么

在我的模型中添加代码

[Serializable]
public class RANKDModel
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public List<thingsModel> thingList { get; set; }
    public IEnumerable<SelectListItem> thingRank { get; set; }
}

您正在for循环中创建许多下拉列表。我想您需要它们,以便用户可以在每行中选择一些内容。现在你有这个:

@Html.DropDownListFor(modelItem => modelItem.thingRank, 
    (IEnumerable<SelectListItem>)ViewBag.thingRank, "Rank it Bro.")
在GET操作中,您需要将该属性设置为与thingList相同的项数,因为您需要为每个项设置下拉列表。这样做:

// ...other code
model.SelectedRanks = new List<int>(model.thingList.Count);
return View(model);
现在,每个dropdownlist都将有一个唯一的名称。例如,如果您有3个下拉列表,它们的名称将是:SelectedRanks[0]、SelectedRanks[1]和SelectedRanks[2]

当用户提交表单时,您可以从每个dropdownlist中检索所选值,如下所示:

[HttpPost]
public ActionResult Index(RANKDModel model)
{
    // model.SelectedRanks will have the value selected
    // For example, model.SelectedRanks[0] will have the value selected
    // in the first dropdown, model.SelectedRanks[1] will have value 
    // selected in the second dropdown and so on.
}
最后的一些建议

请给你的财产起一个有意义的名字。例如,thingList不是一个有意义的名称。 类名称和属性名称使用Pascal表示法。所以应该是thingList而不是thingList。 如果您的首字母缩略词是2个字符,请使用大写字母,否则请使用Pascal表示法。例如,RANKDModel应该是RANKDModel,它不应该拼写为RankedModel吗?
有很多关于如何在asp mvc中使用dropdownlist的教程。为什么你需要邮寄的所有物品?你只需要用户选择的项目,就是这样。我同意我只需要选择的项目。在我的for循环中,我试图通过hiddenfor实现这一点。这就是我错的地方吗?我看过很多例子,但没有一个适合我的案例。所选的项目将在model.thingRank中。我需要看看你在RankdModel中的代码我在问题的底部添加了这个模型。谢谢你。你在这里做的每件事都有很多错误,不知道从哪里开始。生成IEnumerable的代码甚至没有意义。我建议你从阅读以下内容开始,至少要了解一些基本知识——还有一个小改动,就是这样做了,谢谢。在get方法中,我分配列表中每个项目的id,而不是整数值。一旦我改变了这一点,它工作得很好。至于你的其他建议。我很可能会考虑他们的意见。一天晚上,我和一些朋友一起开发了这个小应用程序,它有点像一个玩笑,我只是想进一步开发它。谢谢你的帮助。我很清楚,我不是MVC方面的专家。
@Html.DropDownListFor(modelItem => this.Model.SelectedRanks[i], 
    this.Model.thingRank, "Rank it Bro.")
[HttpPost]
public ActionResult Index(RANKDModel model)
{
    // model.SelectedRanks will have the value selected
    // For example, model.SelectedRanks[0] will have the value selected
    // in the first dropdown, model.SelectedRanks[1] will have value 
    // selected in the second dropdown and so on.
}