0

現在、この問題に頭を悩ませています。パラメータを必要としないメソッドがあり、パラメータを追加する必要がありますが、メソッドが呼び出されるすべての異なる場所にパラメータを追加したくありません。これは私の現在の方法です:

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を確認しています。

ありがとう

4

5 に答える 5

2

以下にデフォルト値を割り当てることができますviewModel

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

このように、単純に を呼び出すとGetItems()、 として扱わviewModelれますnew ItemDescriptionFormViewModel()

于 2012-04-26T13:48:49.643 に答える
0

皆さん... この問題を解決するためのすべての助けと努力に感謝します. 私は最終的にそれを回避することができました。これが私の問題を修正した人です: Checking List Item Id

于 2012-04-27T12:48:47.923 に答える
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 はクラスなので

于 2012-04-26T13:42:50.373 に答える
0

ここで null 参照を逆参照しています。

_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()したがって、ビュー モデルが null の場合は、句を更新してパスを追加できます。

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

次にnull、引数として安全に渡すことができ、デフォルトのパラメーター値を作成することもできるため、パラメーターが渡されない場合、null.

もちろん、これはItemDescriptionFormViewModelクラスであると仮定しています。構造体の場合は、null 可能にする必要があります。ItemDescriptionFormViewModel?

于 2012-04-26T13:43:39.287 に答える
0

両方のメソッド (GetItems() と GetItems(viewModel) を意味します) を保持したい場合、それらは自動的にオーバーロードされます。

2番目の方法が必要な場合は、次のようにパラメーターを渡すことができます

 private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel? viewModel)

これで、null をパラメーターとして渡すことができます。

于 2012-04-26T13:45:38.933 に答える