如何更新複雜模型?我有以下觀點:更新ASP.NET MVC 2中的複雜模型?
<%@ 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(周);但那並不奏效。所以我讀了一些關於必須在複雜模型中分別更新每個屬性的東西,並試圖使其適應我的情況。這是我在控制器上的嘗試:
[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使用。
我不知道這是否要走,我只需要了解如何能夠更新像這樣的複雜類型模型。這不能太少見,所以必須有一些標準方法,但我不知道它...
任何想法?
UPDATE:
以下工作:
操作方法:
[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>
<% } %>
然而,更新必須手動這樣的,這似乎不必要的複雜。我發現菲爾哈克(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對象似乎並不是同一個發送到視圖的對象,它的任務集合中沒有任何項目,例如
那麼爲什麼不能「T這項工作?
好吧,我可以試試,我沒有立即看到如何將麥e差異(屬性在視圖中正確顯示,這不是問題,只是更新不起作用)。行動方法呢?應該如何正確更新? (正如我剛纔提到的,當前一個不正確,編譯器將不允許int值timeSegment.Hours作爲UpdateMethod()中的TModel。 – Anders 2010-12-11 15:41:24
@Anders Svensson:嘗試更新星期實例:'UpdateModel(week)' – 2010-12-12 00:23:48
謝謝,改爲a而不是foreach幫助我現在可以使用它,但我仍然無法以簡單的方式更新模型。請參閱上面的更新。任何想法爲何無法使用? – Anders 2010-12-12 21:53:04