C# MVC编辑隐藏字段中存储的复杂对象
假设我有一个非常庞大的模型,其中包含列表,甚至那些列表也可以包含包含其他列表的对象。我想在MVC4(或5)中创建一个没有AJAX的编辑表单 所以我认为第一部分是将整个对象存储在客户端的隐藏字段中。列表绑定就像一个符咒,请参见。现在,完整的往返运行正常,我可以在绑定的隐藏字段中将整个对象推送到客户机,在提交时它会返回给我,并将发布的隐藏字段放入复杂对象、嵌套列表和包含的所有内容中 列表或其他对象应根据某些操作变得可编辑。一种情况是,单个对象或列表项显示为不可编辑,当用户单击它时,该对象或列表项就地可编辑,例如,网格中的单元格成为文本框。另一种情况是,完全不显示单个对象或列表项,当用户单击按钮时,会出现一个带有文本输入字段的弹出窗口 有没有一个库或经验证的方法可以做到这一点?Jeditable可以做同样的事情并且更容易实现 是否有一个库或一个行之有效的方法来做到这一点 到底为什么?在视图中显示大规模模型以进行编辑?使网格可编辑?或者弹出网格记录进行编辑 基本上,我认为你把这件事复杂化了一点。如果您在这里应用一些分离的关注点,您将发现一切变得多么容易,事实上它非常容易实现,最重要的是更容易维护和扩展 从模型开始,我们假设您有一个巨大的模型,名为C# MVC编辑隐藏字段中存储的复杂对象,c#,javascript,asp.net-mvc,datagrid,model-binding,C#,Javascript,Asp.net Mvc,Datagrid,Model Binding,假设我有一个非常庞大的模型,其中包含列表,甚至那些列表也可以包含包含其他列表的对象。我想在MVC4(或5)中创建一个没有AJAX的编辑表单 所以我认为第一部分是将整个对象存储在客户端的隐藏字段中。列表绑定就像一个符咒,请参见。现在,完整的往返运行正常,我可以在绑定的隐藏字段中将整个对象推送到客户机,在提交时它会返回给我,并将发布的隐藏字段放入复杂对象、嵌套列表和包含的所有内容中 列表或其他对象应根据某些操作变得可编辑。一种情况是,单个对象或列表项显示为不可编辑,当用户单击它时,该对象或列表项就地
Company
,具有以下属性:
- 公司ID(内部)
- 公司名称(字符串)
- CompanyLegalID(字符串)
- 公司注册号(字符串)
- ContactInfo(
class)ContactInfo
- 总部地址(“地址”类)
- 分支机构(分支机构列表)
- 员工(员工类别列表)
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