我目前在解决这个问题时遇到了一些麻烦。我有一个不需要任何参数的方法,现在我需要添加一个参数,但我不想在调用该方法的所有不同位置添加参数。这是我目前的方法:
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 :(得分: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)
答案 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