这可能是一个棘手的问题,但是可以解决。
假设我有一个主视图,我们称之为MainView.cshtml
。
现在,MainView.cshtml
具有一个名为MainViewModel.cs
的专用ViewModel,其中包含一个变量Model.ExampleItems
,该变量是类ExampleItem
的IEnumerable。
现在说我还有一个名为_PartialView.cshtml
的局部视图,其ViewModel只是ExampleItem
。
好的,这就是我遇到的问题。 MainView.cshtml
可以动态调用_PartialView.cshtml
,以便用户可以创建新的ExampleItem
。如何将每个用户创建的ExampleItem
保存到MainViewModel
的IEnumerable ExampleItems?
这是一些示例代码
MainView.cshtml
@model Models.ViewModels.MainViewModel
@foreach (var item in Model.ExampleItems)
{
await Html.RenderPartialAsync("_PartialView", item);
}
<button id="AddExampleItem" type="button" class="btn btn-primary">Add Example Item</button>
_PartialView.cshtml
@model Models.ExampleItem
<input asp-for="VariableOne" />
<input asp-for="VariableTwo" />
<input asp-for="VariableThree" />
如何将^^^保存到原始
Model.ExampleItems
中? 最佳答案
您在这里有两条路。无论哪种方式,为了绑定发布的ExampleItem
,必须以ExampleItems[N].Property
格式命名表单字段。因此,要做到这一点,您可以执行以下操作:
使用for
循环而不是foreach
并传递HtmlFieldPrefix
:
@foreach (var i = 0; i < Model.ExampleItems; i++)
{
var viewData = new ViewDataDictionary(ViewData);
viewData.TemplateInfo.HtmlFieldPrefix = "ExampleItems[" + i.ToString + "]";
await Html.RenderPartialAsync("_PartialView", Model.ExampleItems[i]);
}
您还需要将
ExampleItems
设置为List<ExampleItem>
而不是IEnumerable<ExampleItem>
,否则将引发一个枚举两次的异常(先计数再循环)。为
ExampleItem
创建一个编辑器模板,然后使用EditorFor
。只需在~/Views/Shared/EditorTemplates/ExampleItem.cshtml
创建一个视图,然后将您的部分代码放在那里。然后,在主视图中,您将执行以下操作:@Html.EditorFor(m => m.ExampleItems)
Razor将智能地确定您已将其传递给集合,并为该集合中的每个项目呈现编辑器模板。同样,重要的是,它将具有集合的完整上下文,因此它将使用适当的名称前缀,以便在发布时所有内容均正确绑定。