2010-12-09 6 views
0

У меня есть приложение расписания, которое имеет вид, в котором пользователь может выбирать клиентов и задачи и добавлять их в динамическую таблицу. Эта таблица заполняется заданиями и полями ввода для заполнения отработанных часов.Модель не обновляется в приложении MVC 2

Для добавления новых задач в динамическую таблицу я использую jQuery, поэтому кнопка savenewtask не является кнопкой отправки. Вместо этого у меня есть правильная кнопка отправки для сохранения часов при заполнении.

Вид строго типизирован для модели под названием TimesheetViewModel (см. Ниже). Контроллер передает модель в представление, а затем поля ввода привязаны к свойствам модели.

Однако, когда я отправляю с помощью кнопки отправки и пытаюсь обновить модель в контроллере, она не обновляется. Как видно из учебника 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(); 
    } 
} 

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

Почему модель не обновляется, и что я могу изменить, чтобы сделать его работу?

ответ

0

Поместите контрольную точку в свой первый индекс ActionResult(), это вызов, когда вы отправляете? вам может понадобиться [HttpGet], иначе я думаю, что он получит оба.

+0

Я попробовал, но нет, этот никогда не называется. – Anders 2010-12-09 19:18:52

Смежные вопросы