是否在ASP.NET MVC 2中更新复杂模型?
如何更新复杂模型?我有以下看法:是否在ASP.NET MVC 2中更新复杂模型?,asp.net,asp.net-mvc,asp.net-mvc-2,updatemodel,Asp.net,Asp.net Mvc,Asp.net Mvc 2,Updatemodel,如何更新复杂模型?我有以下看法: <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Tidrapportering.Models.Week>" %> <% using (Html.BeginForm()) {%> <%: Html.ValidationSummary(true) %> <fieldset> <legend>Fie
<%@ 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>
但这也不起作用。如果属性是一个字符串,它似乎可以工作,但这是一个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();
}
}
即,仅接收周作为方法的参数(在Haacks的例子中,他甚至不需要调用UpdateModel,只要将视图绑定到对象就足够了,所以我只需要将其保存在数据库中……但这对我不起作用。返回的Week对象似乎与发送到视图的对象不同,它的任务集合中没有任何项,例如
那么为什么这不起作用呢?尝试使用
for
而不是foreach
<fieldset>
<legend>Fields</legend>
<table width="100%">
<% for (int i = 0; i < Model.Tasks.Count; i++)
{
var task = Model.Tasks[i];
%>
<tr>
<td>
<%: task.Customer.CustomerName %>
</td>
<td>
<%: task.TaskName %>
</td>
<td>
<% for (int j = 0; j < task.TimeSegments.Count; j++)
{ %>
<%= Html.TextBox("Model.Tasks["+i+"].TimeSegments["+j+"].Hours")%>
<% } %>
</td>
</tr>
<% } %>
</table>
<p>
<input type="submit" value="Spara tid" />
</p>
</fieldset>
领域
尝试使用for
而不是foreach
<fieldset>
<legend>Fields</legend>
<table width="100%">
<% for (int i = 0; i < Model.Tasks.Count; i++)
{
var task = Model.Tasks[i];
%>
<tr>
<td>
<%: task.Customer.CustomerName %>
</td>
<td>
<%: task.TaskName %>
</td>
<td>
<% for (int j = 0; j < task.TimeSegments.Count; j++)
{ %>
<%= Html.TextBox("Model.Tasks["+i+"].TimeSegments["+j+"].Hours")%>
<% } %>
</td>
</tr>
<% } %>
</table>
<p>
<input type="submit" value="Spara tid" />
</p>
</fieldset>
领域
好的,我可以试试。我不知道这会有什么不同(属性在视图中正确显示,这不是问题,只是更新不起作用)。那么操作方法呢?看起来应该如何正确更新?(正如我提到的,当前的一个不正确,编译器不允许在UpdateMethod()中将int值timeSegment.Hours作为TModel。@Anders Svensson:尝试更新week实例:UpdateModel(week)
谢谢,改为for而不是foreach很有帮助。我现在可以让它工作了,只是我仍然无法用简单的方式更新模型。请参阅上面我的更新。你知道为什么这不起作用吗?@Anders Svensson:如果你做更新模型(周)会发生什么
?但是从模型中获取周不是作为动作参数。恐怕也不起作用。我获取了一个填充的对象,但它在页面刷新时具有所有旧值,而不是更改的值。当我尝试将其作为参数接收回来时,我也不明白未填充的周对象从何而来。为什么sam不起作用如Haack示例中所示?这是因为我的Week对象使用嵌套for循环来获取较低级别的属性吗?好吧,我可以尝试一下。我没有立即看到这会有什么不同(属性在视图中正确显示,这不是问题,只是更新不起作用).action方法呢?应该如何正确更新?(如我所述,当前的方法不正确,编译器不允许在UpdateMethod()中将int值timeSegment.Hours作为TModel。@Anders Svensson:尝试更新week实例:UpdateModel(week)
谢谢,改为for而不是foreach很有帮助。我现在可以让它工作了,只是我仍然无法用简单的方式更新模型。请参阅上面我的更新。你知道为什么这不起作用吗?@Anders Svensson:如果你做更新模型(周)会发生什么
?但是从模型中获取周不是作为动作参数。恐怕也不起作用。我获取了一个填充的对象,但它在页面刷新时具有所有旧值,而不是更改的值。当我尝试将其作为参数接收回来时,我也不明白未填充的周对象从何而来。为什么sam不起作用是否因为我的Week对象使用嵌套for循环来获取较低级别的属性?
[HttpPost]
public ActionResult EditTasks(Week week)
{
try
{
UpdateModel(week);
_model.Save();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
<fieldset>
<legend>Fields</legend>
<table width="100%">
<% for (int i = 0; i < Model.Tasks.Count; i++)
{
var task = Model.Tasks[i];
%>
<tr>
<td>
<%: task.Customer.CustomerName %>
</td>
<td>
<%: task.TaskName %>
</td>
<td>
<% for (int j = 0; j < task.TimeSegments.Count; j++)
{ %>
<%= Html.TextBox("Model.Tasks["+i+"].TimeSegments["+j+"].Hours")%>
<% } %>
</td>
</tr>
<% } %>
</table>
<p>
<input type="submit" value="Spara tid" />
</p>
</fieldset>