Asp.net mvc 如何在分组列表中发布带有已编辑项的模型?

Asp.net mvc 如何在分组列表中发布带有已编辑项的模型?,asp.net-mvc,razor,model,Asp.net Mvc,Razor,Model,我有以下问题。我需要编辑分组列表中的项目值,并将模型发布到服务器 我的模型和视图模型: public class MyObject { public string ParentName { get; set; } public string SubParentName { get; set; } public string ItemName { get; set; } public decimal Value { get; set; } } public cla

我有以下问题。我需要编辑分组列表中的项目值,并将模型发布到服务器

我的模型和视图模型:

public class MyObject
{
    public string ParentName { get; set; }
    public string SubParentName { get; set; }
    public string ItemName { get; set; }
    public decimal Value { get; set; }
}

public class MyViewModel
{
    public IList<MyObject> list;
}
公共类MyObject
{
公共字符串ParentName{get;set;}
公共字符串子属性名{get;set;}
公共字符串ItemName{get;set;}
公共十进制值{get;set;}
}
公共类MyViewModel
{
公共IList列表;
}
简化的(没有分组项目的html表分组)视图的实现:

@model MyViewModel

@(using (Html.BeginForm("Action", "Controller", FormMethod.Post)))
{
    <table>
        <tbody>
            @foreach(var parentItems in Model.list.GroupBy(x => x.ParentName))
            {
                foreach(var subParents in parentItem.GroupBy(x => x.SubItemName))
                {
                    foreach (var item in subParents)
                    {
                        <tr>
                            <td><parentItems.FirstOrDefault().ParentName</td>
                            <td><subParents.FirstOrDefault().SubParentName</td>
                            <td>item.ItemName</td>
                            <td><input class="itemValue">**Editable value item.Value**</td>
                        </tr>
                    }
                }
            }
        </tbody>
    </table>

    <button type="submit">Save</button>
}
@model MyViewModel
@(使用(Html.BeginForm(“Action”、“Controller”、FormMethod.Post)))
{
@foreach(Model.list.GroupBy(x=>x.ParentName)中的var parentItems)
{
foreach(parentItem.GroupBy(x=>x.SubItemName)中的var子对象)
{
foreach(子当事人中的var项目)
{
x、 SubItemName)。选择(x=>x.ToList())
{
对于(int i=0;ix.list[counter].ItemName)
@Html.HiddenFor(x=>x.list[counter].ItemName)
@TextBoxFor(x=>x.list[counter].Value,新的{myAttr=“myAttrValue”});
@Html.HiddenFor(x=>x.Reports[counter].ParentName)
@Html.HiddenFor(x=>x.Reports[counter].SubParentName)
}
}
}
拯救
}
谢谢大家的帮助:)您的控制器代码:

[HttpPost]
public ActionResult Action([FromBody] values)
{
}
您的视图代码:

@(using (Html.BeginForm("Action", "Controller", FormMethod.Post)))
{
    <table>
        <tbody>
            @for(int i =0; i< Model.Count; i++)
            {
                 <tr>
                     <td>
                          @Html.DisplayFor(x=> x.ParentName)
                          @Html.HiddenFor(x=> x.ParentName)
                     </td>
                     <!-- same to all not editable fields -->
                     <td>@Html.TextBoxFor(x=> x.Value)</td>
                 </tr>
            }
        </tbody>
    </table>

    <button type="submit">Save</button>
}
@(使用(Html.BeginForm(“Action”、“Controller”、FormMethod.Post)))
{
@for(int i=0;ix.ParentName)
@Html.HiddenFor(x=>x.ParentName)
@Html.TextBoxFor(x=>x.Value)
}
拯救
}

有趣的问题。使用
foreach
循环无法工作,因为控件的回发将不具有正确的索引
名称
属性,并且除非包含条件检查,否则单个
for
循环将不允许分组(例如,测试父项名和子父项名是否与先前呈现的项不同,然后呈现新的组标题或启动新表或其他内容)

我建议您创建一个视图模型,以更好地表示层次结构,并在控制器上填充视图模型

public class MyObject
{
  public string ParentName { get; set; }
  public string SubParentName { get; set; }
  public string ItemName { get; set; }
  public decimal Value { get; set; }
}

public class SubParentVM
{
  public string Name { get; set; } // assuming you want some kind of group heading
  public List<MyObject> Items { get; set; }
}

public class ParentVM
{
  public string Name { get; set; }
  public List<SubParentVM> Items { get; set; }
}
公共类MyObject
{
公共字符串ParentName{get;set;}
公共字符串子属性名{get;set;}
公共字符串ItemName{get;set;}
公共十进制值{get;set;}
}
公共类副家长
{
公共字符串名称{get;set;}//假设需要某种类型的组标题
公共列表项{get;set;}
}
公共类ParentVM
{
公共字符串名称{get;set;}
公共列表项{get;set;}
}
那景色呢

@model List<ParentVM>

for (int i = 0; i < Model.Count; i++)
{
  ....
  for (int j = 0; j < Model[i].Items.Count; i++)
  {
    ....
    for (int k = 0; k < Model[i].Items[j].Count; i++)
    {
      <tr>
        <td>Model[i].Items[j].Items[k].ParentName</td>
        <td>Model[i].Items[j].Items[k].SubParentName</td>
        <td>Model[i].Items[j].Items[k].ItemName</td>
        <td>
          <@Html.TextBoxFor(m => m.[i].Items[j].Items[k].Value)
          // Assuming you want other properties of MyObject to post back
          <@Html.HiddenFor(m => m.[i].Items[j].Items[k].ItemName)
          <@Html.HiddenFor(m => m.[i].Items[j].Items[k].SubParentName)
          <@Html.HiddenFor(m => m.[i].Items[j].Items[k].ParentName)
        </td>
      </tr>
    }
  }
}
@型号列表
for(int i=0;i
控制器

[HttpPost]
public ActionResult Save(List<ParentVM> items)
{
  ....
[HttpPost]
公共操作结果保存(列表项)
{
....

我建议对此编辑器或绑定到模型的编辑器使用
editor或template
。我希望编辑模型列表中的项目。是否编辑项目值?是此值MyObject.value
[HttpPost]
public ActionResult Save(List<ParentVM> items)
{
  ....