我在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格式中的一个相当简单的概念。
答案 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));
}