c# - 如何使用 Razor 在主视图 View 模型中保存部分 View View 模型项?

标签 c# asp.net-mvc asp.net-mvc-4 razor asp.net-mvc-5

这可能是一个棘手的问题,但就是这样。

假设我有一个主视图,我们称它为 MainView.cshtml

现在,MainView.cshtml 有一个名为 MainViewModel.cs 的专用 ViewModel,它包含一个变量 Model.ExampleItems,它是一个 IEnumerable 类ExampleItem.

现在假设我还有一个名为 _PartialView.cshtml 的局部 View ,其 ViewModel 只是 ExampleItem

好的,这就是我卡住的地方。 MainView.cshtml 可以动态调用 _PartialView.cshtml 以便用户可以创建新的 ExampleItem。如何将每个用户创建的 ExampleItem 保存到 MainViewModel 的 ExampleItems IEnumerable?

下面是一些示例代码

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 中?

最佳答案

这里有两条前进的道路。无论哪种方式,为了绑定(bind)发布的 ExampleItem s,表单字段必须以 ExampleItems[N].Property 格式命名.因此,要实现这一点,您可以:

  1. 使用 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>或者您将引发枚举两次的异常(计数然后 for 循环)。

  2. ExampleItem 创建一个编辑器模板然后利用 EditorFor .只需在 ~/Views/Shared/EditorTemplates/ExampleItem.cshtml 创建一个 View ,并将您的部分代码放在那里。然后在您的主视图中,您只需执行以下操作:

    @Html.EditorFor(m => m.ExampleItems)
    

    Razor 将智能地确定您向它传递了一个集合,并为集合中的每个项目呈现编辑器模板。此外,重要的是,它将具有集合的完整上下文,因此它将使用专有名称前缀,以便所有内容在发布时都能正确绑定(bind)。

关于c# - 如何使用 Razor 在主视图 View 模型中保存部分 View View 模型项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36310232/

相关文章:

javascript - Tempdata消息如何隐藏

asp.net - ASP.NET MVC 中的 URL 的 Url.Content ("~/...") 和 "~/"之间有区别吗?

c# - 将上传文件与表单数据一起发送

c# - ASP .Net MVC中的错误处理

asp.net-mvc-4 - 通过c#.net将csv文件上传到blob并在将数据输入数据库后删除它

javascript - 尝试使用 IIS ssl 时获取 ERR_INSECURE_RESPONSE

c# - Unity3d 和 UdpClient

javascript - 在 MVC Web 应用程序中包含 Jquery 时间选择器的步骤

c# - 更新通用存储库中的实体时出错

c# - 找到三个整数的中位数的最有效方法