2010-12-09 49 views
0

我有一个时间表应用程序,它有一个View,用户可以选择客户和任务并将它们添加到动态表格中。该表格填写了填写工作小时数的任务和输入字段。模型没有在MVC 2应用程序中更新

为了在动态表中添加新任务我使用jQuery,因此savenewtask按钮不是提交按钮。相反,我有一个适当的提交按钮,用于保存填入的小时数。

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

但是,当我用提交按钮提交并尝试更新控制器中的模型时,它不会更新。从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> 

从控制器:

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(); 
    } 
} 

视图模型:

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); } } 
} 

为什么模型中未更新,并且我能更改,使其工作?

回答

0

在你的第一个ActionResult索引()上放置一个断点,是否在你提交时调用?你可能需要[HttpGet],否则我认为它同时得到。

+0

我试过了,但没有,那个人永远不会被调用。 – Anders 2010-12-09 19:18:52