2012-04-26 119 views
0

當前我正在檢查選定的項目ID並在顯示上一個選定項目的編輯頁面的下拉列表中顯示。項目根據其活動狀態顯示。所有活動項目都顯示在下拉列表中,如果用戶的上一個選擇選項當前處於非活動狀態,則它應該仍然默認爲下拉列表中的該項目,因爲它是之前所做的選擇。我的問題是,我無法顯示用戶在編輯頁面上選擇的非活動項目。我會後我的代碼,這是在不同的環節問了一個問題的延續:passing null parameters檢查清單項目Id

我的代碼中的控制器:

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null) 
{ 
    if(viewModel == null) 
     viewModel = new AppointmentViewModel(); 
    IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll().OrderBy(
     c => c.Sort == null).ThenBy(
      c => c.Sort).ThenBy(c => c.Description); 

    if(items.Count()==0) 
     ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural)); 
    return 
     _itemDescriptionRepository.FindAll().OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == viewModel.ItemDescriptionId).Select(
      c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
} 

我的編輯方法控制器:

[HttpGet] 
    [AppointmentAuthorization] 
    public ActionResult Edit(Guid appointmentId) 
    { 
     Appointment appointment = _appointmentService.Get(appointmentId); 
     if (appointment == null) return View("NotFound"); 


     var viewModel = new AppointmentViewModel 
          { 
           AppointmentId = appointment.AppointmentId, 

          }; 
     viewModel.Items= GetItems(); 

     return this.RazorView("Edit", viewModel); 
    } 

它看起來像缺少一些東西,並將viewModel作爲參數傳遞給viewModel.Items = GetItems()並沒有太大的作用。我還有另一個用於編輯的Post方法和一個調用GetItems()方法的Create方法。任何幫助都會很棒。謝謝:d

這就是我在我的ViewModel類:

public IEnumberable<SearchItems> Items {get; set;} 
public Guid ItemDescriptionid {get; set;} 

創建方法:

[HttpGet] 
    [AppointmentAuthorization] 
    public ActionResult Create(Guid caseId) 
    { 
     var viewModel = new AppointmentViewModel 
          { 
           Items= GetItems() 
          }; 

     return this.RazorView("Create", viewModel); 
    } 

***** SOLUTION *****

private IEnumerable<SearchItems> GetItems(Appointment appointment) 
    { 
     IEnumerable<short?> itemDescriptionIds = 
      appointment.AppointmentItems.Where(c => c.ItemDescriptionId.HasValue).Select(
       c => c.ItemDescriptionId).Distinct(); 

     IOrderedQueryable<ItemDescription> itemDescription = 
      _itemDescriptionRepository.FindAll().Where(
       a => a.IsActive == true || itemDescriptionIds.Contains(a.ItemDescriptionId)).OrderBy(
        d => d.Description); 

     return itemDescription.Select(c=> new SearchItems{Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
    } 
+0

在您的viewModel中初始化了appointmentId。這是一個錯字嗎?你說你的ViewModel中甚至沒有AppointmentId。 – DMulligan 2012-04-26 20:43:18

+0

我的壞...我沒有添加它認爲它不是問題的一部分。我刪除了一些像startDate和其他並沒有處理getItems的東西。但是約會是初始化的。 – Masriyah 2012-04-26 20:48:57

+1

我的觀點是你在你的viewmodel中設置了appointmentId而不是itemdescriptionid。 – DMulligan 2012-04-26 21:08:10

回答

0

原因代碼不查詢以前選擇的值是因爲您的查詢a.ItemDescriptionId == viewModel.ItemDescriptionId,比較項目說明ID ,但在您的視圖模型中,您只能設置約會ID。如果你需要物品描述編號,那麼確保你初始化它。

var viewModel = new AppointmentViewModel 
{ 
    AppointmentId = appointment.AppointmentId, 
    ItemDescriptionId = appointment.ItemDescriptionId 
}; 

建議重構:

private IEnumerable<SearchItems> GetItems(Guid lastId = new Guid()) 
{ 
    IOrderedQueryable<ItemDescription> items= _itemDescriptionRepository.FindAll(); 

    if(!items.Any()) 
     ModelState.AddModelError("", string.Format("No active {0} entered.", Kids.Resources.Entities.ItemDescription.EntityNamePlural)); 

    return items 
     .OrderBy(c => c.Description).Where(a=>a.IsActive == true || a.ItemDescriptionId == lastId) 
     .Select(c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
} 

這是愚蠢的視圖模型來傳遞,當你使用它的所有正在採取必要的Guid。然後稱之爲

viewModel.Items= GetItems(appointment.ItemDescriptionId); 

如果您的查詢仍然沒有添加正確的項目,請嘗試調試它。

var testExists = itemDescriptionRepository.FindAll().FirstOrDefault(a.ItemDescriptionId == lastId); 

如果您沒有找到它,並且您確定lastId設置正確,那可能是數據庫問題。

+0

我只是試過這個,現在我得到一個錯誤頁面指出:無法從類型'System.Guid'轉換爲鍵入'System.Int16'。 – Masriyah 2012-04-26 20:17:23

+0

錯誤在哪裏?你的itemDescriptionId是一個guid還是一個整數?你的代碼從來沒有被正確查詢的初始原因是你只在viewmodel中設置了appointmentId,然後你比較itemDescriptionId,它始終爲null /默認值。 – DMulligan 2012-04-26 20:19:33

+0

我相信這是itemDescriptionId始終爲空的問題,我無法將其包裹在頭上。我得到的錯誤消息是在我的視圖頁面.cshtml文件中,紅線是:self.items = @ Html.Raw(Json.Encode(Model.Items)); – Masriyah 2012-04-26 20:21:58