在MVC 5的View中同时编辑IEnumerable项集合

时间:2015-07-29 16:42:57

标签: c# asp.net-mvc razor model-view-controller

我有一个项目集合,命名为#34; 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(当然没有格式化/换行符)。

我不知道如何创建一个编辑器模板&#34; Multiple&#34;,这是我到目前为止所做的:

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

我不确定在哪里放置它/创建它,所以我只是将它作为另一个视图放在同一个文件夹中。

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

1 个答案:

答案 0 :(得分:3)

与编程中的大多数事情一样,有多种方法可以实现这一点。但是,如果你想进入编辑器模板路线,那就非常简单了。

正如@ JamieD77指出的那样,编辑器模板进入Views\Shared\EditorTemplates。但是,该路径中最重要的部分是EditorTemplates目录约定。与MVC中的任何其他视图一样,您可以根据放置视图的位置覆盖/回退。例如,Areas\Foo\Views\Shared\EditorTemplates也会起作用,但它只能用于Foo区域。或者,您可以将其置于Views\Foo\EditorTemplates

中,以覆盖特定控制器

然后,视图的名称应与其要使用的类型相对应。在您的情况下,视图应命名为A.cshtml。您可以在技术上手动指定视图名称,方法是将其传递给EditorFor或使用类似UIHint的内容,但是在此处依赖惯例会更容易,也更加万无一失。

在此视图中,您应该为A的单个实例创建一个具有所有可编辑属性的外观。然后,在主视图中,只需在集合属性上调用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>