【问题标题】:how can the Controller detect changes to child entities/rows in a View?控制器如何检测视图中子实体/行的更改?
【发布时间】:2011-04-15 16:54:59
【问题描述】:

以下场景最合适的方法是什么?

我有两个模型:

  1. TimeSheet:由四个属性组成:DayStartTimeDayEndTimeBreakTimeList<TimeSheetHours>
  2. TimeSheetHours:由四个属性组成:ClientIdProjectIdHoursWorked

我的时间表视图被强输入到IEnumerable<TimeSheet> 列表。此列表包含 7 个 TimeSheet 模型,一个用于周日至周六一周中的每一天。此时间表视图使用编辑器模板为一周中的每一天生成DayStartTimeDayEndTimeBreakTime 的输入字段:

每天都有一个关于客户和项目的部分。单击“添加”按钮会触发一个 ajax 函数,该函数调用控制器操作来呈现局部视图,将一行控件(客户端组合框、项目组合框、HoursWorked 文本框)动态插入到当天相应的客户端和项目部分:

当我通过 ajax 调用添加新的客户/项目行时,我很难理解如何更新每个时间表模型的 List<TimeSheetHours>

所以最后,当我提交给控制器以插入时间表时,我在生成视图的列表中拥有了每个时间表模型所需的一切。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 看看我的答案,应该可以解决问题。

标签: asp.net asp.net-mvc-3


【解决方案1】:

您必须在这些元素的名称发布之前对其进行按摩,使其看起来像我在下面的样子,或者在您的 ajax 调用中传递 TimeSheet 的索引,然后创建名称:

TimeSheetHours 索引 = 0

<input type="text" id="TimeSheet[0]_TimeSheetHours[0]_DayStartTime" 
    name="TimeSheet[0].TimeSheetHours[0].DayStartTime" value="1" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[0]_DayEndTime" 
    name="TimeSheet[0].TimeSheetHours[0].DayEndTime" value="2" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[0]_BreakTime" 
    name="TimeSheet[0].TimeSheetHours[0].BreakTime" value="1" />

TimeSheetHours 索引 = 1

<input type="text" id="TimeSheet[0]_TimeSheetHours[1]_DayStartTime" 
    name="TimeSheet[0].TimeSheetHours[1].DayStartTime" value="3" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[1]_DayEndTime" 
    name="TimeSheet[0].TimeSheetHours[1].DayEndTime" value="4" />
<input type="text" id="TimeSheet[0]_TimeSheetHours[1]_BreakTime" 
    name="TimeSheet[0].TimeSheetHours[1].BreakTime" value="0" />

拦截submit 事件并遍历每个TimeSheetHours html-represented 元素并将名称分配为掩码然后提交表单可能会好得多。这应该允许模型绑定器使用填充的 List&lt;TimeSheetHours&gt; 属性重建您的 List&lt;TimeSheet&gt;


这里有一个关于如何解决发布收藏问题的好教程:ASP.NET MVC 2 Model Binding for a Collection

【讨论】:

  • 猎人你好。感谢您的回复。以上三个字段实际上不是问题。它是 TimeSheetHour 字段:ClientId、ProjectId 和 HoursWorked。这些字段是通过部分页面添加的。而且我已经完成了一些字段名称覆盖,以获取与您上面指出的类似格式的名称。
  • 同样的命名原则也适用于select元素
  • Hunter,当我进一步阅读您的答案时,我想补充一点,我实际上传递了一个 id,它表示模型 0-7 的编号,并使用 ajax 调用呈现部分视图时间表小时字段。我将该 id 传递给部分视图以覆盖字段的 id,例如:@Html.DropDownListFor(model => model.ClientId, Model.Clients, new { @id = ViewData.TemplateInfo.HtmlFieldPrefix = "[" + ViewBag. FieldId + "]"})
  • 以下是我创建的名称示例:[0.1].ClientId。 0 是型号(索引),然后我附加行号 0.1,因为我可以有许多时间表小时或相同字段的行:clientid、projectid、工作时间。希望有些帮助。感谢您的帮助。
  • 猎人,感谢您的帮助。您的回答最终将我引向了正确的方向。我基本上有我的前缀不正确。一旦我将它们正确排列,MVC 就很神奇并相应地更新了时间表小时列表。干杯
猜你喜欢
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多