从for循环返回部分视图

时间:2013-11-11 14:57:49

标签: c# asp.net ajax entity-framework partial-views

我的页面允许用户从复选框列表中选择商家,并将这些商家插入数据库。

我使用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,但如果选择了多个业务,则只显示第一个业务。

我猜这是因为控制器方法在第一次成功插入后“返回”,结束进程并且不进行后续调用。

我唯一的困惑是所有的业务都成功插入。我希望那些也会失败,但刷新页面后,所有商家都会正确显示。

2 个答案:

答案 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响应一样。

考虑更改部分视图以接受实体的集合,并在循环中渲染所有实体。