2

我有multiselectlist一个用户可以选择 some 或 none的地方inputvoltages。当用户选择 no时,InputVoltages我的查询会null exception在我调用.Tolist(). 为什么我不只是返回一个空列表?

我正在使用 MVC5 C# 和实体框架 6。

存储库

public IQueryable<InputVoltage> All
{
    get { return context.InputVoltages; }
}

控制器

var newInputVoltages = unitOfWorkPds.InputVoltageRepository
    .All.Where(m => engineeringPdsEditViewModel.SelectedInputVoltages
        .Contains(m.Id))
    .ToList<InputVoltage>();

All确实返回一个列表,但SelectedInputVoltages在未选择任何内容时为空。我想知道这是否是问题所在。

当我使用此查询并为我的索引页面添加 where 语句时,我在调用时没有收到 null 错误ToList

IQueryable<EngineeringPdsIndexViewModel> query = 
    (from a in context.EngineeringPds
     select new EngineeringPdsIndexViewModel
     {
         Id = a.Id,
         Name = a.Name,
         Status = a.Status,
         AnnualQuantities = a.AnnualQuantities,
         ToMarketDate = a.ToMarketDate,
         SubmittedBy = a.SubmittedBy,
         TargetPrice = a.TargetPrice
     });

所以我相信布赖恩对什么是错误的想法是正确的,但这是扩展的问题我有一个多选框,它通过以下方式填充在 get 操作方法中

    IList<InputVoltage> inputVoltagesList = unitOfWorkPds.InputVoltageRepository.All.ToList();

然后

pdsEditViewModel.InputVoltageList = inputVoltagesList.Select(m => new SelectListItem { Text = m.Name, Value = m.Id.ToString() });  in my view I hav@Html.ListBoxFor(m => m.SelectedApprovals, Model.ApprovalList)

但是当用户没有选择时, selectedInputvoltages 进入我的后控制器操作为 null 我如何让它作为一个空列表进入?

更新

对于遇到相同问题的任何人,Brians 的第一个答案解释了该问题。可以在此处找到提交带有空列表的 ListBox 的解决方法

如何从 Asp.net MVC 中的 ListBoxFor 选择框中返回空列表而不是空列表?

4

4 回答 4

3

BCL 中定义的任何扩展方法,用于返回或不IEnumerable<T>返回null。它可能会返回一个空集合,但这与 null 非常不同。IQueryable<T>IEnumerable<T>IQueryable<T>

试试这个:

var newInputVoltages = engineeringPdsEditViewModel.SelectedInputVoltages == null ?
    unitOfWorkPds.InputVoltageRepository.All : 
    unitOfWorkPds.InputVoltageRepository.All.Where(m => engineeringPdsEditViewModel.SelectedInputVoltages.Contains(m.Id)).ToList();
于 2013-11-01T16:24:43.513 回答
2

哪里不会返回null。问题在于论证:

engineeringPdsEditViewModel.SelectedInputVoltages.Contains(m.Id)

NULL engineeringPdsEditViewModel 或 SelectedInputVoltages 可能会导致NullReferenceException被抛出。因此,您需要对这些对象进行空检查。

您可以通过类似的测试样本看到这一结果。这里我们得到一个 nullrefex,因为myString它是 null。因此,当 Where 执行时,它会尝试进行比较并炸毁:

       var test = new TestClass(1);
        var test2 = new TestClass(2);
        var test3 = new TestClass(3);

        List<TestClass> tests = new List<TestClass>();
        tests.Add(test);
        tests.Add(test2);
        tests.Add(test3);

        string myString = null;

        var result = tests.Where(t => myString.Contains(t.Myint.ToString())).ToList();
        Console.WriteLine(result.Count);

更新:(回答您的评论)

您可以像这样返回一个空列表:

List<InputVoltage> newInputVoltages = new List<InputVoltage>();
if(engineeringPdsEditViewModel != null && engineeringPdsEditViewModel.SelectedInputVoltages != null)
{
     //Where params are not null so its safe to use them
     newInputVoltages = unitOfWorkPds.InputVoltageRepository
    .All.Where(m => engineeringPdsEditViewModel.SelectedInputVoltages
    .Contains(m.Id))
    .ToList<InputVoltage>();
}
//else no need to do anything...just return the empty list created above
return newInputVoltages;
于 2013-11-01T16:32:36.573 回答
0

你不会得到一个空列表,它返回 null 是预期的行为。

于 2013-11-01T16:19:09.650 回答
0

创建变量时只需测试输入(我使用了三元运算符),以后不需要任何验证

var newInputVoltages = SelectedInputVoltages.Any() 
          ?  unitOfWorkPds.InputVoltageRepository
                .All.Where(m => engineeringPdsEditViewModel.SelectedInputVoltages.Contains(m.Id))
                .ToList<InputVoltage>()
          : new List<InputVoltage>();
于 2013-11-01T16:20:05.317 回答