2017-08-31 59 views
0

一直用這一個我的頭撞牆了幾天,似乎無法弄清楚或找到一篇文章,回答我的問題。編輯多條記錄 - asp.net mvc

我正在研究一個用於工作的rota系統,這個系統已經基本完成,但我被困在管理區的這一部分。 這將允許管理人員爲特定團隊編輯給定日期範圍內的多個rota條目。 它最終將使用視圖模型來傳遞dateFrom,dateTo和Team(teamID) - 我現在就這樣做了,試圖讓它工作。

的ROTAS存儲在ROTAS表(見下文)。 Rotas table

MorningShift和EveningShift(二者FK的)存儲僱員的工資號例如123456

員工詳細信息都存儲在TeamMembers表(見下文)。 TeamMembers table

在TeamMembers表中的用戶名是員工的工資數。

我的問題是,我似乎無法得到當前輸入的值在旋轉表中顯示在視圖的下拉列表中。它僅在選擇列表(Model.TeamMembers)中顯示了所有下拉列表中的第一名員工。 我的問題是,如何獲取當前值以在視圖中的每個下拉菜單中顯示? 我也嘗試

@Html.DropDownListFor(m => m.Rotas[i].MorningShift, Model.TeamMembers, 
    Model.Rotas[i].TeamMember1.FirstName + " " + Model.Rotas[i].TeamMember1.Surname, null) 

不過,雖然這顯示了正確的員工,它並沒有爲選項設置的值,顯然再次顯示了僱員的名字,因爲這是在選擇列表的。

我到目前爲止有:

控制器:

public async Task<ActionResult> ModifyRotas(DateTime? dateFrom, 
      DateTime? dateTo, int? Team) 
    { 
     Auth auth = new Auth(); 
     bool isAdmin = auth.IsAdmin(); 

     if (!isAdmin) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.Unauthorized); 
     } 

     if (dateFrom != null && dateTo != null) 
     { 
      DateTime today = DateTime.Today; 
      DateTime startDate = Convert.ToDateTime(dateFrom); 
      DateTime endDate = Convert.ToDateTime(dateTo); 

      // Make sure earlier shifts can't be modified 
      if (startDate < today) 
      { 
       startDate = today; 
      } 


      // Verify the team exists 
      Team teamDetails = await db.Teams.FindAsync(Team); 
      if (teamDetails == null) 
      { 
       return HttpNotFound(); 
      } 

      ModifyRotaVM vm = new ModifyRotaVM(); 

      // Get rotas for the team for the dates specified 
      var rotas = await db.Rotas.Where(r => r.TeamID == Team && (r.ShiftDate >= startDate && r.ShiftDate <= endDate)).ToListAsync(); 

      vm.Rotas = rotas; 

      // Generate the dropdown lists 
      var teamMembers = db.TeamMembers.Where(m => m.TeamID == Team && m.Deleted == 0).Select(m => new SelectListItem() { Text = m.FirstName + " " + m.Surname, Value = m.Username }); 
      ViewBag.MorningShift = teamMembers; 
      ViewBag.EveningShift = teamMembers; 

      vm.TeamMembers = teamMembers; 

      return View(vm); 

     } 

     // If we got here, something went wrong; redisplay the form 
     return RedirectToAction("Modify"); 
    } 

的VM:

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

    namespace TeamRota.Models 
    { 
     public class ModifyRotaVM 
     { 
      public List<Rota> Rotas { get; set; } 

     public IEnumerable<SelectListItem> TeamMembers { get; set; } 
     } 
    } 

的觀點:

@model TeamRota.Models.ModifyRotaVM 

    @{ 
     ViewBag.Title = "ModifyRotas"; 
    } 

    <h2>Modify Rotas</h2> 

    @using (Html.BeginForm("RotaMod", "Rotas", new { area = "Admin" }, 
    FormMethod.Post)) 
    { 
    // Being passed in so we can redirect back to the same page after the update 
    @Html.Hidden("startDate", Request.QueryString["dateFrom"]) 
    @Html.Hidden("endDate", Request.QueryString["dateFrom"]) 
    @Html.Hidden("TeamID", Request.QueryString["Team"]) 

    <table width="100%"> 
     <tr> 
      <td>Shift date</td> 
      <td>Morning shift</td> 
      <td>Evening shift</td> 
     </tr> 

     @for (int i = 0; i < Model.Rotas.Count(); i++) 
     { 

     <tr> 
      <td> 
       @Html.HiddenFor(m => m.Rotas[i].ID) 
       @Html.DisplayFor(m => m.Rotas[i].ShiftDate) 
      </td> 
      <td>@Html.DropDownListFor(m => m.Rotas[i].MorningShift, Model.TeamMembers, Model.Rotas[i].TeamMember1.FirstName + " " + Model.Rotas[i].TeamMember1.Surname, null)</td> 
     <td>@Html.DropDownListFor(m => m.Rotas[i].EveningShift, Model.TeamMembers, Model.Rotas[i].TeamMember.FirstName + " " + Model.Rotas[i].TeamMember.Surname, null)</td> 
    </tr> 
    } 

    <tr> 
     <td colspan="4"><input type="submit" class="btn btn-success" value="Update" /></td> 
    </tr> 
    </table> 

    } 

會很感激的任何幫助,任何人可以提供。

謝謝。

Tom

+0

我] .TeamMember1.Surname'到你的DropDownListFor?如果您正在修改,使用標籤的目的是什麼?如果您正在修改,則應在頁面加載時顯示正確的值。如果您正在創建,則應使用標籤。 –

+0

我試圖看看它是否會把正確的員工自動選中 - 我對asp相對來說比較陌生。net和mvc – Tom

+0

這解釋了爲什麼它沒有與之相關的價值,以及它在選擇列表中再次顯示。我認爲這個問題的解決方案可能是一點點測試,看看會發生什麼......所以我會發佈一個解決方案,即使它最初可能不正確。如果沒有,我們可以通過它。 –

回答

0

我認爲你應該嘗試重新創建你的SelectList的DropDownListFor。

var teamMembers = db.TeamMembers.Where(m => m.TeamID == Team && m.Deleted == 0).Select(m => new { Text = m.FirstName + " " + m.Surname, Value = m.Username }); 
ViewBag.TeamMembers = teamMembers 
在你看來

然後,你就必須做到這一點:你爲什麼將這一`Model.Rotas [I] .TeamMember1.FirstName + 「」 + Model.Rotas [

@Html.DropDownListFor(m => m.Rotas[i].MorningShift, new SelectList(ViewBag.TeamMembers, "Value", "Text", Model.Rotas[i].TeamMember1.Username), null) 

@Html.DropDownListFor(m => m.Rotas[i].EveningShift, new SelectList(ViewBag.TeamMembers, "Value", "Text", Model.Rotas[i].TeamMember.Username), null) 
+0

如何將rota編號加入選擇列表? – Tom

+0

我剛編輯我的答案。看看這是否? –

+0

號獲得一個編譯器錯誤:編譯器錯誤消息:CS0121:呼叫是以下方法或屬性之間曖昧:「SelectExtensions.DropDownListFor (的HtmlHelper ,表達>,IEnumerable的< SelectListItem>,IDictionary )'和'SelectExtensions.DropDownListFor (HtmlHelper ,表達式>,IEnumerable ,字符串)' – Tom