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

像这样声明它:

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

您在此处取消引用空引用:

_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()因此,如果视图模型为空,您可以更新您的子句以添加 pass:

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

然后你可以null安全地作为参数传递,你甚至可以设置一个默认参数值,所以如果没有传递参数,它假定null.

当然,这是假设ItemDescriptionFormViewModel是一个类,如果它是一个结构,那么你必须让它可以为空ItemDescriptionFormViewModel?

于 2012-04-26T13:43:39.287 回答
0

如果您想保留这两种方法(我的意思是 GetItems() 和 GetItems(viewModel)),它们将自动重载。

如果你想要第二种方法,你可以像这样传递参数

 private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel? viewModel)

现在您可以将 null 作为其参数传递。

于 2012-04-26T13:45:38.933 回答
0

大家...感谢您在尝试解决此问题时的所有帮助和努力。我终于能够解决它,这是我解决问题的人:检查列表项 ID

于 2012-04-27T12:48:47.923 回答