C# 将IEnumerable传递给控制器
我正在HTTPGet中构建一个IEnumerable,并将其传递给我的视图。我的问题是使用hiddenfor将所选信息返回控制器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]
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.
}