模型不在MVC 2应用程序中更新

时间:2010-12-09 17:13:48

标签: asp.net asp.net-mvc-2 mvvm

我有一个时间表应用程序,其中包含一个View,用户可以在其中选择客户和任务并将其添加到动态表中。此表填充了用于填写工作小时数的任务和输入字段。

为了在动态表中添加新任务,我使用jQuery,因此savenewtask按钮不是提交按钮。相反,我有一个正确的提交按钮,用于在填写时节省时间。

View强类型为名为TimesheetViewModel的模型(见下文)。控制器将模型传递给View,然后输入字段绑定到模型中的属性。

但是,当我使用提交按钮提交并尝试更新Controller中的模型时,它不会更新。从Nerddinner教程(我用来学习MVC)看来,模型应该使用它在使用UpdateModel()时绑定的表单字段中的值自动更新。但事实并非如此。我做错了什么?

以下是所有相关代码:

查看:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
 <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            //Hook onto the MakeID list's onchange event
            $("#CustomerId").change(function () {
                //build the request url
                var url = "Timesheet/CustomerTasks";
                //fire off the request, passing it the id which is the MakeID's selected item value
                $.getJSON(url, { id: $("#CustomerId").val() }, function (data) {
                    //Clear the Model list
                    $("#TaskId").empty();
                    //Foreach Model in the list, add a model option from the data returned
                    $.each(data, function (index, optionData) {
                        $("#TaskId").append("<option value='" + optionData.Id + "'>" + optionData.Name + "</option>");
                    });
                });
            }).change();
        });

    </script>
    <h2>Index</h2>

    <% using (Html.BeginForm())
       {%>
    <%: Html.ValidationSummary(true) %>
    <fieldset>
        <legend>Fields</legend>
        <div>
            <label for="Customers">
                Kund:</label>
            <%:Html.DropDownListFor(m => m.Customers, new SelectList(Model.Customers, "Id", "Name"), "Välj kund...", new { @id = "CustomerId" })%>
            &nbsp;&nbsp;
            <label for="Tasks">
                Aktiviteter:</label>
            <select id="TaskId">
            </select>
        </div>
        <p>
            <input type="button" value="Save new task" id="savenewtask" />            
        </p>

        <table width="100%">
        <%--<% foreach (var task in Model.Tasks)--%>
        <% foreach (var task in Model.WeekTasks)
           { %>
        <tr>
            <td>
                <%: task.Customer.Name %>
            </td>
            <td>
                <%: task.Name %>
            </td>
            <td>
                <% foreach (var ts in task.TimeSegments)
                   { %>
                <input class="hourInput" type="text" size="2" id="<%: ts.Task.CustomerId + '_' + ts.TaskId + '_' + ts.Date %>"
                    value="<%: ts.Hours %>" />
                <% } %>
            </td>
        </tr>
        <% } %>
    </table>
    <input type="submit" value="Save hours" id="savehours" />
    </fieldset>
    <% } %>

</asp:Content>

来自Controller:

private TimesheetViewModel _model;

public TimesheetController()
{
    _model = new TimesheetViewModel();
}

public ActionResult Index()
{

    return View(_model);
}

[HttpPost]
public ActionResult Index(FormCollection collection)
{
    try
    {
        UpdateModel(_model);
        _model.Save();
        return View(_model);
        //return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

ViewModel:

public class TimesheetViewModel
{
    private TimesheetContainer _model; //TimesheeContainer is an Entity Framework model

    public TimesheetViewModel()
    {
        _model = new TimesheetContainer();
    }

    public IList<Customer> Customers
    { get { return _model.Customers.ToList(); } }

    public IList<Task> Tasks
    { get { return _model.Tasks.ToList(); } }

    public IList<Task> WeekTasks
    {
        get
        {
            //Get the time segments for the current week
            DateTime firstDayOfWeek = DateTime.Parse("2010-12-05");
            DateTime lastDayOfWeek = DateTime.Parse("2010-12-13");

            List<TimeSegment> timeSegments = new List<TimeSegment>();
            foreach (var timeSegment in _model.TimeSegments)
            {
                if(timeSegment.DateTimeDate > firstDayOfWeek && timeSegment.DateTimeDate < lastDayOfWeek)
                    timeSegments.Add(timeSegment);
            }
            //Group into tasks
            var tasks = from timeSegment in timeSegments
                       group timeSegment by timeSegment.Task
                        into t
                      select new { Task = t.Key };
            return tasks.Select(t => t.Task).ToList();
        }
    }

    public IList<TimeSegment> TimeSegments
    { get { return _model.TimeSegments.ToList(); } }

    public void Save()
    {
        _model.SaveChanges();
    }


    public void AddTimeSegments(Task task)
    {
        _model.AddToTasks(task);
        _model.SaveChanges();
    }

}

获取特定周任务的部分课程(此时仅为虚拟周进行测试):

public partial class TimeSegment
{
    public DateTime DateTimeDate
    { get { return DateTime.Parse(Date); } }
}

为什么模型没有更新,我可以更改什么才能使其正常工作?

1 个答案:

答案 0 :(得分:0)

在你的第一个ActionResult索引()上放一个断点,是否在你提交时被调用?你可能需要[HttpGet],否则我认为两者兼而有之。