【发布时间】:2012-07-17 09:39:20
【问题描述】:
目前我正在尝试基于一系列复选框创建大规模更新。我似乎找不到使用实体框架的正确方法。
我正在使用带有 MVC3 和 Razor 的 ASP.Net 4。
这是我目前的代码。
查看页面(正常工作)
@model List<LeagueCounters.Models.champion>
<form name="setFree id="setFree" method="POST" action="/Champion/SetFree">
@foreach (var item in Model)
{
if (item.isFree == true)
{
<input type="checkbox" id="@item.id" checked="checked" /> @Html.DisplayFor(modelItem => item.displayName)
}
else
{
<input type="checkbox" id="@item.id" /> @Html.DisplayFor(modelItem => item.displayName)
}
}
<p><input type="submit" value="Save" /></p>
控制器(错误)
[HttpPost, Authorize(Roles = "Admin")]
public ActionResult SetFree(FormCollection fcMain)
{
var sortedList = from c in _db.champions
orderby c.name
select c;
int counter = 0;
foreach (champion champ in sortedList)
{
if (fcMain[counter].Contains("true"))
champ.isFree = true;
else
champ.isFree = false;
_db.champions.Attach(champ);
_db.ObjectStateManager.ChangeObjectState(champ, EntityState.Modified);
counter++;
}
_db.SaveChanges();
return View();
}
错误
索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引
问题
如何正确循环浏览控制器中的复选框?一旦我达到那个点,我的批量更新代码会起作用吗?
提前致谢。
【问题讨论】:
-
暂时忽略任何其他问题,您的
fcMain[counter]集合是从 0 开始的,但是您从 1 开始索引/计数器。这意味着您将超过最后一个条目。如果多次使用该站点,假设您的数据收集的长度与复选框的数量相同当然是危险的。 -
我确实将其更改为零,结果相同。
-
您是否调试过代码行并查看了多少条目与多少控件?使用未经测试的索引直接索引到
fcMain是最有可能的失败点。 -
你能比较一下表单集合的数量和模型集合的数量吗?你在用IE吗
标签: c# asp.net asp.net-mvc-3 entity-framework