【问题标题】:Dealing with complex models in ASP.NET MVC在 ASP.NET MVC 中处理复杂模型
【发布时间】:2013-05-07 15:35:57
【问题描述】:

我有一个看起来像这样的模型:

商业 - 分支 - 电话(*) - 电话类型 - 数字 - 营业时间 (*) - 一周中的几天 - 工作时间(*) - 从时间 - 时间 - 自定义字段 (*) - 姓名 - 价值 - 地址 - 地址栏 - 城市 - 状态 - 压缩 ——雅达雅达

我为上面的每个类类型创建了编辑器模板

我想要一个通用的Business 编辑器模板,它带有一个提交表单,可以将整个结构发布到单个操作并保存它,无论是用于现有实体还是新实体。

  1. 编辑器模板是正确的方法吗?如何沿着整个下线提交表单?
  2. 如何使 AddRemove 按钮在表单中添加/删除电话号码?
  3. 如何订购集合中的项目(即我希望每个电话号码附近都有箭头,以便用户可以在客户端列表中向上或向下移动它,然后处理服务器上的保存,因为我已经有了解决方案)。

底线,我的问题是如何将正确的值发回服务器,以及如何修改客户端上的内部集合。一旦正确的数据以这种或其他方式在服务器上,我就会知道如何处理它。我的问题是客户端和数据提交的正确方式。

更新

我看到了this 的答案,它基本上回答了我问题的第一部分,但后两个仍然存在(添加-删除-订单按钮 - 管理客户端上的集合)。
我的问题不是 如何在客户端的 DOM 中添加/删除/重新排序行,但是如何修改客户端数据,然后在操作中在服务器中接收它,如下所示:

[HttpPost]
public ActionResult Save(Business business)
{
  /// blah blah
}

更新

这是我尝试插入新数据的方法:

查看:

@Ajax.ActionLink("Add", "AddCustomField", new AjaxOptions { UpdateTargetId = "customFields", InsertionMode = InsertionMode.InsertAfter })

行动:

public PartialViewResult AddOpeningTimes()
{
  var ot = new OpeningTimes();
  ot.WorkingPeriods.Add(new WorkingPeriod());
  var e = EditorFor(ot);
  //just here for debugging, the values are both empty strings
  e.ViewData.TemplateInfo.HtmlFieldPrefix = ViewData.TemplateInfo.HtmlFieldPrefix;
  return e;
}
//this method is on the base controller:
protected PartialViewResult EditorFor<TModel>(TModel model)
{
  return PartialView("EditorTemplates/" + typeof(TModel).Name, model);
}

问题是 name 没有根据需要枚举适当的字段 (Branches[0].CustomField[0].Key),而是只是 Key

【问题讨论】:

    标签: asp.net-mvc razor http-post form-submit


    【解决方案1】:

    据我所知,没有“简单”的方法可以做到这一点。

    添加按钮 - 您必须连接 javascript 来创建表单的一部分(例如,电话类型选择和电话文本框)并设置其 ID/名称。基本上,您会找到表单中的最后一项,名称为 Phone[x].PhoneType,然后使用 x + 1 将表单新部分的值设置为适当的值。

    避免自己生成表单部分的一个选项是创建一个隐藏的“模板”并复制它。然后更改 id 和 name。

    删除按钮 - 如果您只是从 DOM 中删除项目,您会在序列中创建间隙,而 MVC 不知道如何处理。一种可能的方法是使用隐藏字段将表单中的项目标记为已删除,然后在服务器上进行处理。

    重新排序 - 我会在任何需要此功能的地方添加一个名为 Order 的属性,然后将其呈现为隐藏并在重新排序时使用 javascript 进行更改。您还必须在添加项目时进行适当的设置。

    在这些情况下有用的属性还有:IsNew、IsUpdated - 与 IsDeleted 一起允许在服务器上进行相对轻松的处理。

    当然,如果您有嵌套集合,每个集合都需要添加/删除/重新排序功能,那么执行和调试会有些困难。

    更新

    渲染局部视图的动作无法知道 html 前缀应该是什么,因为它没有上下文(即父级是 Branch 对象等)。

    如果你想使用 AJAX,我建议发送 html 字段前缀作为参数 (public PartialViewResult AddOpeningTimes(string htmlPrefix))。 htmlPrefix 可以是Branches[0].CustomField[last_custom_field + 1].。这可能是实现您想要的最干净的方式,即使它实际上不是很干净。

    【讨论】:

    • 对于添加按钮,我 ajaxingly 调用了一个返回相关字段的部分视图模板的操作,同样对于删除和重新排序,我创建添加/删除/重新排序项目的 jQ 函数没有问题在 DOM 上,对我来说真正的问题是服务器如何在 Save(Business business) 发布操作中接收所有这些内容。请扩展您对如何处理要发送到服务器的数据以及如何以最好的方式在服务器中正确接收它们的答案。
    • 您在将数据发布到服务器时遇到了什么问题?如果您按照您所说的那样使用编辑器模板,则应该将整个结构自动映射回模型。
    • 请详细说明“避免生成零件等的选项”。在你的回答中。
    • 好的,现在我知道问题出在哪里了,但仍然没有解决方案,请参阅我更新的问题。
    • 查看更新的答案。我不知道你使用 AJAX 来渲染局部视图。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多