如何更新复杂模型?我有以下观点:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Tidrapportering.Models.Week>" %>
<% using (Html.BeginForm())
{%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<table width="100%">
<% foreach (var task in Model.Tasks)
{ %>
<tr>
<td>
<%: task.Customer.CustomerName %>
</td>
<td>
<%: task.TaskName %>
</td>
<td>
<% foreach (var ts in task.TimeSegments)
{ %>
<%= Html.TextBox("Hours", ts.Hours)%>
<% } %>
</td>
</tr>
<% } %>
</table>
<p>
<input type="submit" value="Spara tid" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
我像往常一样尝试更新它,只是在模型对象上调用 UpdataModel:UpdateModel(week); 但这没有用。因此,我阅读了一些关于必须在复杂模型中分别更新每个属性的内容,并尝试使其适应我的情况。这是我在控制器中的尝试:
[HttpPost]
public ActionResult EditTasks(int id, FormCollection collection)
{
//try
//{
Week week = _model.GetWeek(id);
foreach (var task in week.Tasks)
{
foreach (var timeSegment in task.TimeSegments)
{
UpdateModel(timeSegment.Hours, "Hours");
}
}
//UpdateModel(week);
_model.Save();
return RedirectToAction("Index");
//}
//catch
//{
// return View();
//}
}
但这也没有用。如果属性是字符串,它似乎可以工作,但这是一个 int,编译器抱怨它必须是一个引用类型才能用作 TModel。
我不知道这是否是要走的路,我只需要了解如何能够更新这样的复杂类型模型。这不能太罕见,所以必须有一些标准方法,但我想不通......
有任何想法吗?
更新:
以下作品:
动作方法:
[HttpPost]
public ActionResult EditTasks(int id, FormCollection collection)
{
try
{
Week week = _model.GetWeek(id);
for (int i = 0; i < week.TaskList.Count; i++)
{
var task = week.TaskList[i];
for (int j = 0; j < task.TimeSegmentList.Count; j++)
{
int hours = Int32.Parse(collection["TaskList[" + i + "].TimeSegmentList[" + j + "].Hours"]);
week.TaskList[i].TimeSegmentList[j].Hours = hours;
}
}
//UpdateModel(week);
_model.Save();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
看法:
<% for (int i = 0; i < Model.TaskList.Count; i++)
{
var task = Model.TaskList[i];
%>
<tr>
<td>
<%: task.Customer.CustomerName %>
</td>
<td>
<%: task.TaskName %>
</td>
<% for (int j = 0; j < task.TimeSegmentList.Count; j++)
{ %>
<td>
<%: Html.TextBoxFor(model => model.TaskList[i].TimeSegmentList[j].Hours, new { @class = "hourInput" })%>
</td>
<% } %>
</tr>
<% } %>
但是,更新必须像这样手动进行,这似乎不必要地复杂。我发现了 Phil Haack 的帖子(http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx),这似乎表明这应该可以用更简单的方式完成, 像这样:
[HttpPost]
public ActionResult EditTasks(Week week)
{
try
{
UpdateModel(week);
_model.Save();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
即简单地接收 Week 作为方法的参数(在 Haacks 示例中,他甚至不需要调用 UpdateModel,只需将 View 绑定到对象似乎就足够了,所以我只需将其保存在数据库...但它对我不起作用。返回的 Week 对象似乎与发送到视图的对象不同,它的任务集合中没有项目,例如
那么为什么这不起作用呢?