在MVC 5的视图中同时编辑IEnumerable项目集合

本文关键字:编辑 IEnumerable 项目 集合 MVC 视图 | 更新日期: 2023-09-27 18:05:19

我有一个项目集合,命名为类型" a ",我想在视图中查看和编辑它的一些属性。我希望它同时保存,然而,这似乎不工作,因为它似乎没有传递任何东西回Post方法。

我的控制器:

[HttpPost]
public ActionResult inline(IEnumerable<A> listA)
{
    for (int i = 0; i <= listA.Count(); i++ )
    {
        A theObj = listA.ElementAt(i);
        db.SaveChanges();
    }  //Somehow this is returning to be Null
}

我的观点:

@model IEnumerable<A>
@using (Html.BeginForm())
{
@Html.EditorForModel("Multiple")
}
到目前为止,由于某种原因,它打印出了所有条目的Id(当然没有格式化/换行)。

我不知道如何创建一个编辑器模板"多个",这是我到目前为止所拥有的:

@model Models.A
@Html.EditorFor(x => x.Id)

我不知道把它放在哪里/创建它,所以我只是把它作为同一个文件夹中的另一个视图。

任何指针我怎么能使这个工作,这样我就可以在同一视图中编辑同一对象的多个条目,并将其传递回控制器并保存它?我是MVC的新手,所以如果这看起来像一个非常简单的问题,我提前道歉。谢谢!

在MVC 5的视图中同时编辑IEnumerable项目集合

像编程中的大多数事情一样,有多种方法可以实现这一点。但是,如果您想使用编辑器模板,这是非常直接的。

正如@JamieD77所指出的,编辑器模板进入Views'Shared'EditorTemplates。不过,该路径最重要的部分是EditorTemplates目录约定。就像MVC中的任何其他视图一样,您可以根据放置视图的位置重写/回退。例如,Areas'Foo'Views'Shared'EditorTemplates也可以工作,但它只适用于Foo区域。或者,您可以通过将其放置在Views'Foo'EditorTemplates中来覆盖特定控制器。

然后,视图的名称应该与它打算使用的类型相对应。在您的示例中,视图应该命名为A.cshtml。从技术上讲,您可以通过将其传递给EditorFor或使用UIHint之类的东西来手动指定视图名称,但在这里仅依赖约定更容易且更万无一无。

在这个视图中,您应该为A的单个实例创建一个外观,并表示所有可编辑属性。然后,在主视图中,只需在collection属性上调用Html.EditorFor,在这里,它是整个模型:

@Html.EditorFor(model => model)

Razor将意识到它有一个集合,并为集合中的每个项目呈现编辑器模板。重要的是,因为它有这个上下文,所以它还能够在字段名上生成适当的索引。

如果你做了下面的事情:

@foreach (var item in Model)
{
    @Html.EditorFor(m => item)
}

您的字段名将不被索引,并且模型绑定器将不知道如何处理发布的数据。如果要使用循环,则必须在循环内使用索引:

@for (var i = 0; i < Model.Count(); i++)
{
    @Html.EditorFor(m => Model[i])
}

然后为Razor提供适当的上下文以生成适当的字段名。然而,重要的是,这种方法需要使用List<T>结构,而不是像IEnumerable<T>ICollection<T>这样的结构。