不确定如何解决我的System.NullReferenceException

时间:2019-04-30 19:45:24

标签: c# asp.net-mvc-5

我在MVC5中有一个索引(列表)视图,该视图是从模型填充的(表ICS_Supplies)。

我在字段ItemDescription(varchar)上添加了一个文本框,用于为用户添加搜索过滤器。如下可以很好地工作:

查看

<form asp-controller="Movies" asp-action="Index">
  <p>
    Search Supplies: <input type="text" name="SearchString">
    <input type="submit" value="Filter" />
  </p>
</form>

控制器

public ActionResult Index(string searchString, string SType, int? page, string YourRadioButton)
{
    // Add SearchBox Filter
    var catalogs = supplies.Where(s =>  s.ItemDescription.Contains(searchString ?? string.Empty));

    // Add paging to the search results
    var pageNumber = page ?? 1;
    return View(catalogs.ToPagedList(pageNumber, 10));
}

这很好用。如果searchString为null,则返回所有结果。如果searchSring具有值,则它将带回ItemDescription包含searchString值的所有结果。

我正在尝试将一个单选按钮添加到索引视图,以便用户还可以在字段InvType上进行过滤,该字段是char(1)字段。它可以是F(对于表格)或S(对于耗材)。因此,我根据选择的内容将YourRadioButton的值设置为F或S。 。 。如下(使用新代码)

索引

<form asp-controller="Movies" asp-action="Index">
  <div>
    Supplies: @Html.RadioButton("YourRadioButton", "S")
    Forms: @Html.RadioButton("YourRadioButton", "F")
  </div>
  <p>
    Search Supplies: <input type="text" name="SearchString">
    <input type="submit" value="Filter" />
  </p>
</form>

然后我用其他代码更新Controller,如下所示:

public ActionResult Index(string searchString, string SType, int? page, string YourRadioButton)
{
    var supplies = db.ICS_Supplies.OrderBy(g => g.ItemDescription).ToList();

    //var supplies2 = supplies.Where(s => s.InvType.Equals(mychoice));
    var supplies2 = supplies.Where(s => s.InvType.Contains(YourRadioButton ?? string.Empty));

    // Add SearchBox Filter
    var catalogs = supplies2.Where(s =>  s.ItemDescription.Contains(searchString ?? string.Empty));

    // Add paging to the search results
    var pageNumber = page ?? 1;
    return View(supplies2.ToPagedList(pageNumber, 10));
}

现在,我收到以下错误消息

System.NullReferenceException

它是指下面的代码行(我添加了)

var supplies2 = supplies.Where(s => s.InvType.Contains(YourRadioButton ?? string.Empty));

我的问题是。 。 。为什么会踢出NullReferenceException,但如果它为null,则另一行工作得很好?以及如何解决该问题-还是有更好的方法将第二个过滤器添加到我的代码中?

此行工作正常,是否为null。它们的编写方式完全相同,只是使用的是YourRadioButton的值而不是searchString,而且我使用的是InvType字段而不是ItemDescription。

var catalogs = supplies2.Where(s => s.ItemDescription.Contains(searchString ?? string.Empty));

请记住,我对MVC5和C#还是很陌生,因此解释为什么会对我有很大的帮助。

关于使用MVC5中的单选按钮,似乎没有很多信息。 。 。旧的Asp.net格式中的一个相当简单的概念。

1 个答案:

答案 0 :(得分:2)

似乎suppliers的某些条目没有InvType。该属性有时为null,因此会收到NullReferenceException,因为您正在对null值属性调用Contains()方法。

在第一个示例中不会发生此问题,因为您使用的是Linq to Entities。 在第二个示例中,您在第一个查询之后调用ToList()。在那之后,一切将继续在内存中工作(Linq to Objects)。然后,您必须在任何where条件下检查null:

var supplies2 = supplies.Where(s => s.InvType != null && s.InvType.Contains(YourRadioButton ?? string.Empty));

我认为最好从第一个查询中删除ToList()。向其中添加where条件,并让PagedList为您执行查询:

public ActionResult Index(string searchString, string SType, int? page, string YourRadioButton)
{
     var supplies = db.ICS_Supplies.AsQueryable();

     if (!String.IsNullOrWhiteSpace(YourRadioButton))
     {
         supplies = supplies.Where(s => s.InvType.Contains(YourRadioButton));
     }

     if (!String.IsNullOrWhiteSpace(searchString))
     {
         supplies = supplies.Where(s =>  s.ItemDescription.Contains(searchString));
     }

     supplies = supplies.OrderBy(g => g.ItemDescription)

     // Add paging to the search results
     var pageNumber = page ?? 1;
     return View(supplies.ToPagedList(pageNumber, 10));
}