【问题标题】:c# mvc5 Editing a nested collectionc# mvc5 编辑嵌套集合
【发布时间】:2014-08-02 20:53:39
【问题描述】:

我正在尝试编辑嵌套集合并将值发布回服务器。 我不知道这是否可能。

Class1 有 Class2 的集合

Class2 有 Class3

Class3 有 Class4 的集合

Class4 有 Class5 的集合

我从 Nuget 安装了包 BeginCollectionItem。

我为它们中的每一个创建了编辑器模板。 但仍然没有显示编辑器。

@using (Html.BeginForm("SaveModification","Client", FormMethod.Post, new { @class =     "form-horizontal", role = "form" }))
{    
    @Html.AntiForgeryToken()
    @Html.HiddenFor(o => o.Id)
    <div class="row">
        <div class="col-md-12">
              @using (Html.BeginCollectionItem("Classes2"))
              {
                @Html.EditorFor(x => x.Classes2)
              }                
        </div>
    </div>
    <div class="row">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default" />
        </div>
    </div>    
}

Class2.cshtml
<div class="row">
    @Html.HiddenFor(o => o.Id)
    @Html.EditorFor(model => model.Class3)
</div>

Class3.cshtml
<div class="row">             
   @Html.HiddenFor(o=>o.Id)
    <div class="row">   
        <div class="col-md-10" >@Html.DisplayFor(model => model.Name)</div>
        <div class="col-md-2">@Html.EditorFor(model => model.Quantity)</div>
    </div>
    <div class="row">
    @using (Html.BeginCollectionItem("Classes4"))
    {              
        @Html.EditorFor(x => x.Classes4)
    }
    </div>
</div>

Class4.cshtml
<div class="row">                   
     <div class="col-md-10" style="padding-left:30px;">@Html.DisplayFor(model => model.Name)</div>
    <div class="col-md-2">@Html.EditorFor(model => model.Quantity)</div>
</div>
<div class="row">                                    
@using (Html.BeginCollectionItem("Classes5"))
{          
    @Html.EditorFor(x => x.Classes5)
}          
</div>

Class5.cshtml
 @Html.HiddenFor(model => model.Id)
<div class="row">
    <div class="col-md-10" style="padding-left:50px;">@Html.DisplayFor(model => model.Name)</div>
    <div class="col-md-2">@Html.EditorFor(model => model.Quantity)</div>
</div>

我的问题:这可能使用嵌套编辑器模板吗?

更新1:

使用提琴手,我看到我的回复包含我编辑的值

Id
Classes2.index
Classes2.index
Classes2[311410b2-6ce1-4a09-9979-552720f377fc].Id
Classes2[311410b2-6ce1-4a09-9979-552720f377fc].Class3.Id
Classes2[311410b2-6ce1-4a09-9979-552720f377fc].Class3.Quantity
Class3.index
Class3[7e8b7a76-7000-4ec9-8877-d150ffe25dc5].Classes4.index
Class3[7e8b7a76-7000-4ec9-8877-d150ffe25dc5].Classes4[3315b9ce-989d-4229-92c5-a7ba9955539d].Id
Class3[7e8b7a76-7000-4ec9-8877-d150ffe25dc5].Classes4[3315b9ce-989d-4229-92c5-a7ba9955539d].Quantity
Classes4.index
Classes4[d8990f17-9d9d-4f21-81e2-70c012c48922].Classes5.index
Classes4[d8990f17-9d9d-4f21-81e2-70c012c48922].Classes5[a8afe9a0-b6e0-42b7-85aa-f5bd967dcab6].Id
Classes4[d8990f17-9d9d-4f21-81e2-70c012c48922].Classes5[a8afe9a0-b6e0-42b7-85aa-f5bd967dcab6].Quantity

但是在我的控制器中,视图模型没有相同的值,一些集合是空的。我只得到 class2 和 class3 值。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    BeginCollectionItem 应该用于单个集合项,而不是集合级别。此外,如果您只想显示集合而不动态添加和删除,则不需要它。

    在您的主视图中,您可以简单地执行以下操作:

    <div class="col-md-12">
        @Html.EditorFor(x => x.Classes2)
    </div>
    

    调用 EditorTemplate Class2.cshtml。 Razor 将自动循环遍历集合并为每个元素呈现您的模板。

    如果您愿意,可以在Class2.cshtml 中将您的代码包装到:

    @using (Html.BeginCollectionItem("Classes2"))
    {
        // Your Template code here... 
    }  
    

    【讨论】:

    • 稍后我会添加其他功能(添加/删除)。目前,我只是想看看它是如何工作的。层次结构正在显示,但我的更改没有发送到我的控制器。知道为什么吗?
    • 检查生成的 HTML 中的输入名称。 name 应映射到模型属性名称,例如 Class3.Quantity 的输入字段应命名为 Classes2[0].Class3.Quantity,其中索引 (0) 将针对集合中的下一个项目递增。
    • 查看我的更新.. 使用提琴手我看到响应包含已编辑的值,但在我的控制器中,视图模型仅包含部分已编辑的值。我得到 Classes2 和 Class3。其他集合为空。有什么提示吗?
    • 我唯一能看到的是Classes2.index 出现了两次,但只有一个元素。 Class3.index 也不应该在那里......无论如何,考虑到您的模型的复杂性,我会尝试在 ViewModel 中展平您的集合,这样您就只有一层嵌套,然后在 Controller 中您可以来回映射在模型和视图模型之间。
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2022-01-26
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多