어떻게하면 복잡한 모델을 업데이트 할 수 있습니까? 나는 다음과 같은보기가 있습니다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>
<% } %>
그러나, 갱신이 같은 매뉴얼이어야한다, 불필요하게 복잡해 보입니다. 나는 이런 식으로,이 간단한 방법으로 할 수 있어야한다 제안하는 것 같다 필 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을 호출해야하는 것조차 보이지 않는다. 뷰를 객체에 바인딩하는 것으로 충분하기 때문에 데이터베이스에 저장하면된다. ... 그러나 그것은 나를 위해 작동하지 않습니다. 반환 된 Week 개체는보기로 보낸 것과 같지 않습니다. 즉, 작업 모음에 항목이 없습니다. 예 :
그런데 왜 doesn 't이 작동합니까?
좋아하여보십시오. 내가 바로 그 막'방식을 볼 수 없습니다 차이점 (보기에서 속성이 올바르게 표시되지만 문제가되지는 않습니다. 단지 작동하지 않는 업데이트 일뿐입니다). 액션 메소드는 어떻습니까? 어떻게 제대로 업데이트 되야합니까? (앞에서 언급했듯이 컴파일러는 UpdateMethod()에서 TModel로 int 값 timeSegment.Hours를 허용하지 않습니다. – Anders
@Anders Svensson : 주 인스턴스 업데이트 : UpdateModel (week) –
감사합니다. for foreach 대신 for로 변경하면 도움이되었지만, 지금은 작동하도록 만들 수 있습니다. 간단하게 모델을 업데이트 할 수 없습니다. 위의 업데이트를 참조하십시오. 이것이 작동하지 않는 이유는 무엇입니까? – Anders