2012-04-26 108 views
0

我目前在解決這個問題時遇到了一些麻煩。我有一個方法,不需要任何參數,現在我需要添加一個參數,但我不想在調用該方法的所有不同位置添加參數。這是我目前的方法:傳遞null參數

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null) 
    { 
     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 || viewModel == null || a.ItemDescriptionId == viewModel.ItemDescriptionId).Select(
       c => new SearchItems {Text = c.Description, Value = c.ItemDescriptionId.ToString()}); 
    } 

我試着傳遞null作爲其他地方的參數調用此方法,但我得到一個錯誤。什麼方式來超載這個問題?

目的:添加viewModel的目的是因爲我有一個下拉列表與活動項目可供選擇。一旦用戶選擇活動項目,然後出於某種原因該項目變爲非活動狀態並且用戶去編輯他們的選擇。在下拉列表中應該有活動項目的列表以及他們之前選擇的項目現在不活動。我正在使用ViewModel來檢查先前選擇的項目的ID。

感謝

+0

你會得到什麼錯誤? – nemesv 2012-04-26 13:40:16

+0

@Amina:null是viewModel參數的有效值嗎? – Dennis 2012-04-26 13:41:26

+0

@丹尼斯我有這樣的參數:ItemDescriptionFormViewModel viewModel = null。 – Masriyah 2012-04-26 13:47:14

回答

0

大家...感謝您嘗試解決此問題的所有幫助和努力。我終於能夠解決它,這裏是我解決了我的問題的人:Checking List Item Id

0

聲明它是這樣的:

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel viewModel = null) 

,並確保有一個null檢查在你的方法,這樣的事情:

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

這將允許你打電話使用GetItems()GetItems(ItemDescriptionFormViewModel viewModel)的方法

編輯:無視?因爲ItemDescriptionFormViewModel是一類

+0

當我嘗試這個我有一個對象引用未設置爲對象錯誤的實例。它指的是我的.cshtml查看頁面。 – Masriyah 2012-04-26 14:05:44

+0

什麼對象你會得到那個錯誤?你在方法的其他地方使用viewModel嗎? – DangerMonkey 2012-04-26 14:10:15

+0

確切的行是:self.items = @ Html.Raw(Json.Encode(Mode.Items)); 在方法我目前有我唯一的時間使用viewModel只是檢查一個項目的代碼,我目前在代碼中。 – Masriyah 2012-04-26 14:13:31

0

你在這裏提領一空引用:

_itemDescriptionRepository.FindAll() 
    .OrderBy(c => c.Description) 
    .Where(a=>a.IsActive == true || 
     a.ItemDescriptionId == viewModel.ItemDescriptionId) // if viewModel null, this throws 
    .Select(c => new SearchItems 
    { 
     Text = c.Description, Value = c.ItemDescriptionId.ToString() 
    }); 

所以你可以只更新Where()條款添加通如果視圖模型爲空:

... 
.Where(a => a.IsActive || viewModel == null || viewModel.ItemDescriptionId == a.ItemDescriptionId) 

然後,您可以安全地通過null作爲參數,甚至可以設置默認參數值,因此如果沒有參數傳遞,它將採用null

這是當然的,假設ItemDescriptionFormViewModel是一類,如果它是一個結構,那麼你就必須使其可爲空ItemDescriptionFormViewModel?

+0

當我調整代碼時,我得到的對象引用未設置爲我的.cshtml視圖頁上的對象錯誤的實例。 – Masriyah 2012-04-26 14:07:49

+0

@Amina:在哪一行?這是唯一使用viewModel的地方。你能用最新的代碼更新你的問題嗎? – 2012-04-26 14:20:53

+0

我更新了自己的代碼。確切的錯誤行在我的視圖頁面中:self.items = @ Html.Raw(Json.Encode(Model.Items));以及我之前評論中提到的錯誤消息。我對這個錯誤有些困惑。會顯示我的viewModel幫助嗎?我非常感謝幫助 - 謝謝。 – Masriyah 2012-04-26 14:28:08

0

如果你想保留這兩種方法(我的意思是GetItems()和GetItems (viewModel))它們會自動超載。

如果你想在第二個方法,你可以傳遞參數這樣

private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel? viewModel) 

現在,你可以把null作爲它的參數。

+0

只有當ItemDescriptionFormViewModel是一個值類型,即一個結構。此外,您還需要記住檢查'viewModel.HasValue',如果返回true,則可以通過'viewModel.Value'獲取它的值。 – 2012-04-26 13:55:27

+0

這對我不適用cuz ItemDescriptionFormViewModel是一個類。 – Masriyah 2012-04-26 14:06:17

2

您可以將默認值賦給viewModel

private IEnumerable<SearchItems> GetItems(
    ItemDescriptionFormViewModel viewModel = null) 
{ 
    if (viewModel == null) 
     viewModel = new ItemDescriptionFormViewModel(); 

這樣一來,如果你只需調用GetItems(),它將把viewModel作爲new ItemDescriptionFormViewModel()

+0

當我試着這個我得到這個錯誤:'viewModel'的默認參數值必須是一個編譯時常數 – Masriyah 2012-04-26 14:02:33

+0

所以我認爲你必須使用默認值ItemDescriptionFormViewModel viewModel = null和比較值。 – 2012-04-26 14:15:25

+0

我做了這也是別人建議,但現在我得到的對象引用沒有設置爲對象錯誤的實例。 – Masriyah 2012-04-26 14:17:08