1

如何更新复杂模型?我有以下观点:

<%@ 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 对象似乎与发送到视图的对象不同,它的任务集合中没有项目,例如

那么为什么这不起作用呢?

4

1 回答 1

1

尝试使用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>
于 2010-12-11T14:57:55.013 回答