2012-10-26 65 views
3

我有一個視圖有2個日期選擇器,其中一個是開始日期,另一個是結束日期。我可以讓用戶選擇開始日期和結束日期,重定向到一個視圖,該視圖將有一個工作時間列表,用戶可以更改日期,輸入時間,一旦完成,他們應該能夠點擊保存按鈕,它應該創建每個工作到數據庫的新實例。我得到的視圖顯示沒有問題,但是當表單發佈我的枚舉模型爲null時,表單集合只有一個可訪問的項目,我不知道爲什麼。請查看我在下面創建的視圖,以瞭解我正在做什麼,並告訴我是否可以以任何方式幫助我。保存一個IEnumerable模型

@model IEnumerable<TimeCollection.Models.TimeWorked> 

@{ 
    ViewBag.Title = "Create TimeWorked Range"; 
} 

<h2>Create TimeWorked Range</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.WorkDate) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.HoursWorked) 
     </th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     @Html.HiddenFor(modelItem => item.EmployeeId) 
     <td> 
      @Html.EditorFor(modelItem => item.WorkDate) 
     </td> 
     <td> 
      @Html.EditorFor(modelItem => item.HoursWorked) 
     </td> 
     <td> 
      @Html.HiddenFor(modelItem => item.BeenSubmitted) 
     </td> 
    </tr> 
} 

</table> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace TimeCollection.Models 
{ 
    public class TimeWorked 
    { 
     public int TimeWorkedId { get; set; } 
     public int EmployeeId { get; set; } 
     public DateTime WorkDate { get; set; } 
     public int HoursWorked { get; set; } 
     public bool BeenSubmitted { get; set; } 

     public static void CreateTimeWorked(TimeWorked timeWorkedToCreate) 
     { 
      string insertQuery = string.Format("insert into time_worked (employee_id, work_date, work_hours, been_submitted) values ('{0}', '{1}', '{2}', '{3}')", timeWorkedToCreate.EmployeeId, timeWorkedToCreate.WorkDate.ToString("yyyy/MM/dd"), timeWorkedToCreate.HoursWorked, (timeWorkedToCreate.BeenSubmitted == true ? "1" : "0")); 
      SpectrumData.Utility.ExecuteMySqlCommand(SpectrumData.Properties.Resources.SpectrumTSDatabaseConnectionString, insertQuery); 
     } 

     public static TimeWorked ReadTimeWorked(int timeWorkedId) 
     { 
      string selectQuery = string.Format("select * from time_worked where time_worked_id = '{0}'", timeWorkedId); 
      return ConvertDataRowIntoTimeWorked(SpectrumData.Utility.FillDataSet(SpectrumData.Properties.Resources.SpectrumTSDatabaseConnectionString, selectQuery).Tables[0].Rows[0]); 
     } 

     public static void UpdateTimeWorked(TimeWorked timeWorkedToUpdate) 
     { 
      string updateQuery = string.Format("update time_worked set work_date = '{0}', work_hours = '{1}', been_submitted = '{2}' where time_worked_id = '{2}'", timeWorkedToUpdate.WorkDate, timeWorkedToUpdate.HoursWorked, timeWorkedToUpdate.BeenSubmitted, timeWorkedToUpdate.TimeWorkedId); 
      SpectrumData.Utility.ExecuteMySqlCommand(SpectrumData.Properties.Resources.SpectrumTSDatabaseConnectionString, updateQuery); 
     } 

     public static void DeleteTimeWorked(int timeWorkedId) 
     { 
      string deleteQuery = string.Format("delete from time_worked where time_worked_id = '{0}'", timeWorkedId); 
      SpectrumData.Utility.ExecuteMySqlCommand(SpectrumData.Properties.Resources.SpectrumTSDatabaseConnectionString, deleteQuery); 
     } 

     private static TimeWorked ConvertDataRowIntoTimeWorked(System.Data.DataRow timeWorkedDataRow) 
     { 
      TimeWorked timeWorked = new TimeWorked(); 
      timeWorked.BeenSubmitted = (timeWorkedDataRow["been_submitted"].ToString() == "1" ? true : false); 
      timeWorked.EmployeeId = int.Parse(timeWorkedDataRow["employee_id"].ToString()); 
      timeWorked.HoursWorked = int.Parse(timeWorkedDataRow["work_hours"].ToString()); 
      timeWorked.TimeWorkedId = int.Parse(timeWorkedDataRow["time_worked_id"].ToString()); 
      timeWorked.WorkDate = DateTime.Parse(timeWorkedDataRow["work_date"].ToString()); 

      return timeWorked; 
     } 
    } 
} 

public ActionResult CreateTimeWorkedRange(DateTime startDate, DateTime endDate) 
    { 
     List<Models.TimeWorked> listOfTimeWorked = new List<Models.TimeWorked>(); 
     DateTime beginning = startDate; 
     DateTime ending = endDate; 

     while (beginning <= ending) 
     { 
      Models.TimeWorked dayWorked = new Models.TimeWorked() 
      { 
       EmployeeId = (Session["InventoryReviewUser"] as SpectrumData.SpectrumTS.InventoryReviewUser).EmployeeId, 
       WorkDate = beginning 
      }; 

      if (listOfTimeWorked.Contains(dayWorked) == false) 
      { 
       listOfTimeWorked.Add(dayWorked); 
      } 

      beginning = beginning.AddDays(1); 
     } 

     return View(listOfTimeWorked); 
    } 

    [HttpPost] 
    public ActionResult CreateTimeWorkedRange(List<Models.TimeWorked> modelList) 
    { 
     foreach (Models.TimeWorked timeWorked in modelList) 
     { 
      Models.TimeWorked.CreateTimeWorked(timeWorked); 
     } 
    } 

回答

1

我不知道是否有更好的方法,但要做到這一點的一種方法是使用數組的索引如下綁定您的項目:

@for (int i = 0; i < Model.Count; ++i) { 
    <tr> 
     @Html.HiddenFor(modelItem => Model[i].EmployeeId) 
     <td> 
      @Html.TextBoxFor(modelItem => Model[i].WorkDate) 
     </td> 
     <td> 
      @Html.TextBoxFor(modelItem => Model[i].HoursWorked) 
     </td> 
     <td> 
      @Html.HiddenFor(modelItem => Model[i].BeenSubmitted) 
     </td> 
    </tr> 
} 

你需要一個您的模型的不同集合類型(IList<TimeWorked>應該沒問題)才能使用索引器,但這不應該是我想象的問題。當你發佈時,收集應該正確填寫。