传递null参数

时间:2012-04-26 13:35:15

标签: c# asp.net-mvc parameter-passing

我目前在解决这个问题时遇到了一些麻烦。我有一个不需要任何参数的方法,现在我需要添加一个参数,但我不想在调用该方法的所有不同位置添加参数。这是我目前的方法:

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。

由于

5 个答案:

答案 0 :(得分:2)

您可以为viewModel分配默认值:

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

这样,如果您只是致电GetItems(),则会将viewModel视为new ItemDescriptionFormViewModel()

答案 1 :(得分: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是一个类

答案 2 :(得分: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()
    });

因此,如果视图模型为null,您可以更新Where()子句以添加pass:

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

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

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

答案 3 :(得分:0)

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

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

 private IEnumerable<SearchItems> GetItems(ItemDescriptionFormViewModel? viewModel)

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

答案 4 :(得分:0)

每个人......感谢您尝试解决此问题的所有帮助和努力。我终于能够解决它,这就是我解决问题的原因:Checking List Item Id