我的页面允许用户从复选框列表中选择商家,并将这些商家插入数据库。
我使用foreach循环遍历表单集合中的每个项目,然后通过db上下文保存。
所有这一切都运作良好。
public ActionResult RecordBusinesses(FormCollection collection)
{
foreach (var item in collection.GetValues("mycheckboxlist"))
{
modelentity modelentity = new modelentity();
if (ModelState.IsValid)
{
db.modelentity.Add(modelentity);
db.SaveChanges();
}
return PartialView("_mypartialview", modelentity);
}
return PartialView("_mypartialview");
}
在视图中,复选框列表以ajax形式包装。
@using (Ajax.BeginForm(
"RecordBusinesses",
new AjaxOptions
{
HttpMethod = "POST",
InsertionMode = InsertionMode.InsertBefore,
UpdateTargetId = "insertedbusiness"
}))
{
foreach(var b in Model)
{
<input type="checkbox" name="mycheckboxlist" value="@b.businessid">@b.name
<br />
}
</div>
<input type="submit" />
}
这个表单会发布到操作中,而且一切都运行良好。
我的问题是只有第一个条目会回发到屏幕上。因此,如果在复选框中仅选择了一个业务,则从控制器返回的部分视图将添加到dom,但如果选择了多个业务,则只显示第一个业务。
我猜这是因为控制器方法在第一次成功插入后“返回”,结束进程并且不进行后续调用。
我唯一的困惑是所有的业务都成功插入。我希望那些也会失败,但刷新页面后,所有商家都会正确显示。
答案 0 :(得分:3)
这里的问题是你的行动
public ActionResult RecordBusinesses(FormCollection collection)
{
foreach (var item in collection.GetValues("mycheckboxlist"))
{
...
return PartialView("_mypartialview", modelentity);
}
return PartialView("_mypartialview");
}
从请求结束的操作return
开始,ASP.NET不理解您想要遍历循环的其余部分。如果是这样,它将导致多次调用&amp;从你可能不想要的服务器。
考虑一下,你的代码相当于
for(int i = 0; i <= 10; i++)
{
Console.WriteLine(i);
return i;
}
这只会输出0
。看起来你真正关注的是yield关键字
for (int i = 0; i <= 10; i++)
{
yield return i;
}
我非常确定您在HTTP请求的上下文中无法在ASP.NET中执行此操作。
解决这个问题的方法是完成所有渲染服务器端。更改您的操作以将模型实际传递回某个容器视图
public ActionResult RecordBusinesses(FormCollection collection)
{
List<Entity> myEntities = ...;
foreach (var item in collection.GetValues("mycheckboxlist"))
{
...
myEntities.Add(new ...);
}
return View("SomeContainerView", myEntities);
}
然后在您的视图中,进行调用以呈现每个部分
@model System.Collections.Generic.List<Entity>
@foreach (var entity in Model)
{
@Html.RenderPartial("_mypartialview", entity)
}
答案 1 :(得分:1)
您无法从一个操作返回多个部分视图,就像您无法为一个HTTP请求接收多个HTTP响应一样。
考虑更改部分视图以接受实体的集合,并在循环中渲染所有实体。