我对MVC5和C#都是陌生的。我有一个耗材视图(列表)。我想对int字段“ Onhand”进行过滤。用户可以在此处在过滤器文本框中输入一个数字,然后我们会立即带回所有等于或小于指定数字的耗材。
这是我观点的相关部分:
<form asp-controller="Movies" asp-action="Index">
<p>
Search Supplies: <input type="text" name="SearchString">
<input type="submit" value="Filter" />
</p>
<p>
</p>
</form>
这是我在努力使控制器中的功能正常工作的地方
var supplies = db.ICS_Supplies
.OrderByDescending(g => g.Supplies_ID)
.ToList();
var catalogs = supplies
.Where(s => s.OnHand.HasValue<(searchString ?? string.Empty));
var pageNumber = page ?? 1;
return View(catalogs.ToPagedList(pageNumber, 10));
具体地说。 。此行:
var catalogs = supplies
.Where(s => s.OnHand.HasValue<(searchString ?? string.Empty));
我觉得自己快要到了,但是还不太了解如何使用<=
的{{1}}值来int
。 searchstring
是一个OnHand
字段。我还需要将int?
设为searchString
吗?我的过滤器正确吗?
更新
这是修改后的控制器代码。 。截至目前
int
答案 0 :(得分:1)
将我们的对话浓缩为一个答案,您表示您对以下代码行有疑问:
var catalogs = supplies.Where(s => s.OnHand.HasValue < (searchString ?? string.Empty));
这里有几个问题。首先,HasValue
返回一个bool
,因此我们无法对其进行<
比较。相反,如果HasValue
是true
,那么我们想对Value
属性进行比较:
var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value < searchValue)
但是,我们需要使用int
代替上面的searchValue
,并且在您的原始代码中,您使用的是字符串。因此,我们需要将字符串转换为int
,最安全的方法是int.TryParse
,它返回指示成功的bool
,并设置out
参数如果成功,则转换为转换后的值。
由于您说过,如果字符串为null
,我们应该返回所有值,那么我们应该从字符串中创建一个值,如果它是null
,它将是最大值。因此,我们可以执行以下操作:
int searchValue;
// If searchString is null (or not an int), then set our searchValue to int.MaxValue
if (!int.TryParse(searchString, out searchValue)) searchValue = int.MaxValue;
现在,我们可以使用以下searchValue
来过滤查询:
var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value <= searchValue)
答案 1 :(得分:0)
这不是答案...但是旨在帮助您,这很难看...
public ActionResult Reorder(string searchString, int? page)
{
/// this has performance issues
var supplies = db.ICS_Supplies.OrderByDescending(g => g.Supplies_ID).ToList();
// problem here is you are checking for null, in a c# way and not linq
var catalogs = supplies.Where(s => s.OnHand.HasValue && (searchString == null || s.Value <= int.Parse(searchString)));
var pageNumber = page ?? 1;
return View(catalogs.ToPagedList(pageNumber, 10));
}
这需要更多的工作,但更易于阅读...并希望对您有帮助
public ActionResult Reorder(string searchString, int? page)
{
/check your string first
if(searchString == null)
searchString = "";
///from the below im guessing searchString is an int
var int value = int.Parse(searchString);
var supplies = db.ICS_Supplies.Where(x => x.OnHand != null
&& searchString.Contians(x.FieldName)
.OrderByDescending(x => x.Supplies_ID)
.ToList(); // to list forces a pull of the results
//other stuff to work on
var pageNumber = page ?? 1;
return View(catalogs.ToPagedList(pageNumber, 10));
}
答案 2 :(得分:0)
public ActionResult Reorder(string searchString, int? page)
{
int convertInt = 0;
var catalogs = db.ICS_Supplies
.OrderByDescending(g => g.Supplies_ID)
.ToList();
if (Int32.TryParse(searchString, out convertInt))
{
catalogs = supplies
.Where(s =>
s.OnHand.HasValue &&
s.OnHand.Value <= convertInt);
}
var pageNumber = page ?? 1;
return View(catalogs.ToPagedList(pageNumber, 10));
}