C# MVC编辑隐藏字段中存储的复杂对象

C# MVC编辑隐藏字段中存储的复杂对象,c#,javascript,asp.net-mvc,datagrid,model-binding,C#,Javascript,Asp.net Mvc,Datagrid,Model Binding,假设我有一个非常庞大的模型,其中包含列表,甚至那些列表也可以包含包含其他列表的对象。我想在MVC4(或5)中创建一个没有AJAX的编辑表单 所以我认为第一部分是将整个对象存储在客户端的隐藏字段中。列表绑定就像一个符咒,请参见。现在,完整的往返运行正常,我可以在绑定的隐藏字段中将整个对象推送到客户机,在提交时它会返回给我,并将发布的隐藏字段放入复杂对象、嵌套列表和包含的所有内容中 列表或其他对象应根据某些操作变得可编辑。一种情况是,单个对象或列表项显示为不可编辑,当用户单击它时,该对象或列表项就地

假设我有一个非常庞大的模型,其中包含列表,甚至那些列表也可以包含包含其他列表的对象。我想在MVC4(或5)中创建一个没有AJAX的编辑表单

所以我认为第一部分是将整个对象存储在客户端的隐藏字段中。列表绑定就像一个符咒,请参见。现在,完整的往返运行正常,我可以在绑定的隐藏字段中将整个对象推送到客户机,在提交时它会返回给我,并将发布的隐藏字段放入复杂对象、嵌套列表和包含的所有内容中

列表或其他对象应根据某些操作变得可编辑。一种情况是,单个对象或列表项显示为不可编辑,当用户单击它时,该对象或列表项就地可编辑,例如,网格中的单元格成为文本框。另一种情况是,完全不显示单个对象或列表项,当用户单击按钮时,会出现一个带有文本输入字段的弹出窗口

有没有一个库或经验证的方法可以做到这一点?

Jeditable可以做同样的事情并且更容易实现

是否有一个库或一个行之有效的方法来做到这一点

到底为什么?在视图中显示大规模模型以进行编辑?使网格可编辑?或者弹出网格记录进行编辑

基本上,我认为你把这件事复杂化了一点。如果您在这里应用一些分离的关注点,您将发现一切变得多么容易,事实上它非常容易实现,最重要的是更容易维护和扩展

从模型开始,我们假设您有一个巨大的模型,名为
Company
,具有以下属性:

  • 公司ID(内部)
  • 公司名称(字符串)
  • CompanyLegalID(字符串)
  • 公司注册号(字符串)
  • ContactInfo(
    ContactInfo
    class)
  • 总部地址(“地址”类)
  • 分支机构(分支机构列表)
  • 员工(员工类别列表)
财产清单可能会一直持续下去。将这个模型分解成更小的模型会更容易、更容易。创建具有以下属性的
CompanyModel
模型

  • 公司ID(内部)
  • 公司名称(字符串)
  • CompanyLegalID(字符串)
  • 公司注册号(字符串)
然后制作一个
CompanyContactInfo
模型等等。明白了吗?同样,关注点分离简化了很多事情。然后,创建操作方法和视图以读取/编辑这些模型

现在,对于大质量对象的列表属性,您也要这样做。例如,对于
Employee
对象列表,更容易创建具有以下属性的
CompanyEmployeesModel
模型:

  • 公司ID(内部)
  • 员工(员工模型列表)
然后创建控制器操作方法以显示员工列表

public ActionResult EmployeeList(int companyId)
{
    var employees = BusinessLogic.Get_Me_Employees_For(companyId);
    CompanyEmployeesModel model = new CompanyEmployeesModel();
    model.CompanyId = companyId;
    model.Employees = employees;

    return View(model);
}
希望到目前为止你已经明白了这个想法。在视图中,只需创建一个css格式的表来显示员工列表,razor使其超级简单

<table class="grid">
   <tr>
      <th></th>
        <th>
            Name
         </th>
         <th>
            Phone
          </th>
    </tr>

            @{
                 var alt = false;

                foreach (var emp in Model.Employees)
                {                    
                    <tr class="@(alt ? "alt" : string.Empty)">
                        <td class="cmd">
                            @ActionLink("edit", "Edit", "Employees", new { empId = emp.Id}, null)
                        </td>
                        <td>@emp.Name</td>
                        <td>@emp.Phone</td>
                    </tr>

                    alt = !alt;
                }

            }
</table>

名称
电话
@{
var-alt=false;
foreach(Model.Employees中的var emp)
{                    
@ActionLink(“编辑”、“编辑”、“员工”,新的{empId=emp.Id},空)
@皇帝姓名
@电磁脉冲电话
alt=!alt;
}
}
请注意,表格的第一列有链接“edit”,它将用户带到
Employee
控制器的
edit
操作方法,在该方法中,显然您将执行与较小型号相同的操作。我所做的就是分离逻辑、模型和视图,使它们更简单、更易于维护和理解


希望这一切对您有意义

非常庞大的模型是一项业务需求,它必须作为一个实体进行编辑,最好是在一个页面上,这非常有意义,但我不能谈论它。我最初认为(或希望)有一个易于描述的解决方案,但显然,这在MVC中并不常见。这与AJAX非常不同,它有它的优点和缺点。当然,它的使用范围更广,因此有更多的文档记录。如果没有AJAX,只有一个往返过程,这个过程稍微大一点,但它的用户体验更流畅。无论如何,这里有一个粗略的指南,如何按照我要求的方式来做

正如我在问题中所说的,客户机-服务器往返由MVC处理,其中(大部分)隐藏字段。稍后可以通过用JSON编码一些内容而不是隐藏字段来优化它,这不会影响系统的其余部分

普通字段存储在普通编辑器中,而不是隐藏字段。从客户机-服务器往返的角度来看,这没有什么区别。因此,这些可以在适当的位置进行编辑

网格渲染也很容易。在这种情况下,服务器端MVC网格是次优的,因为它们会向客户端发送冗余数据。幸运的是,还有更多的客户端网格解决方案,它们本质上是独立于服务器平台的。只需从隐藏字段收集所需数据,并在页面加载时使用JavaScript网格库从中构建网格。当然,正如我所说,列表可以包含大量数据和其他嵌套列表,但是在这个简单的网格中,必须选择一些必要的列,这没有问题

现在是有趣的部分,如何编辑包含所有复杂数据的网格行。假设我的模型中有一个人员列表,他们有一个地址列表。有一个人格,和wh