问问题
1791 次
0

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

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

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

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

4

2 回答 2

4

这里的问题是你的行动

public ActionResult RecordBusinesses(FormCollection collection)
{
    foreach (var item in collection.GetValues("mycheckboxlist"))
    {
        ...
        return PartialView("_mypartialview", modelentity);
    }
    return PartialView("_mypartialview");
}

一旦您return从请求结束的操作开始,ASP.NET 就不会理解您想要遍历循环的其余部分。如果是这样,它将导致从服务器多次调用 & ,这可能是您无论如何都不想要的。

想想看,你的代码相当于

for(int i = 0; i <= 10; i++)
{
    Console.WriteLine(i);
    return i;
}

这只会输出0。看起来你真正想要的是yield关键字

for (int i = 0; i <= 10; i++)
{
    yield return i;
}

我很确定您不能在 ASP.NET 中在 HTTP 请求的上下文中执行此操作。

解决这个问题的方法是做你所有的渲染服务器端。更改您的操作以将您的模型实际传递回某个容器视图

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)
}
于 2013-11-11T15:05:10.710 回答
1

您不能从一个操作返回多个部分视图,就像您不能为一个 HTTP 请求接收多个 HTTP 响应一样。

考虑更改局部视图以接受实体集合并在循环中呈现所有实体。

于 2013-11-11T15:05:18.880 回答