是否在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>