【发布时间】:2019-08-26 22:39:51
【问题描述】:
我正在创建一个应用程序,用户可以在其中保存已购买食品的库存。当新用户创建他们的储藏室时,他们可以选择创建新成分或添加其他用户之前提交的成分(即,如果其他用户的储藏室中已经有这种名为鸡胸肉的新成分,则无需创建此成分)。
在我的视图页面上,我有一个表单,用户可以在其中选择已添加的成分以添加到他们自己的储藏室中。现在,我可以毫无问题地显示数据库中的所有成分,并将这些成分添加到当前用户的储藏室中。
我正在尝试添加一个搜索/过滤功能,允许用户搜索数据库中已有的成分。这样一来,他们就不必滚动数百个项目来准确找到他们想要添加的内容,或者确定他们是否必须创建这种成分,因为其他用户在他们的数据库中没有该成分。
查看 (newIngredients.cshtml)
@model AddIngredientsView
@{
ViewBag.Title = "Pantry Setup";
ViewBag.HeaderText = "Add Your First Set of Ingredients To Your Pantry";
Layout = "~/Views/Home/_Layout.cshtml";
}
<div class="formBox">
<form asp-action="CreateIngredients" asp-contoller="Home" method="post">
<h3>Existing Ingredients</h3>
@using (Html.BeginForm("NewIngredients", "Home", FormMethod.Get))
{
@Html.TextBox("searching")<input type="submit" value="Search">
}
@for(int i =0; i < Model.AllIngredients.Count; i++){
@Html.HiddenFor(m => m.AllIngredients[i].id);
<label asp-for="IsAddedIngredient[i]">@Model.AllIngredients[i].Name</label>
<input type="checkbox" asp-for="IsAddedIngredient[i]">
<label asp-for="AddIngredientsQuantity[i]">Quantity</label>
<input type="number" step="0.01" asp-for="AddIngredientsQuantity[i]">
<br>
}
</div>
视图模型 (AddIngredientsView.cs)
using System.Collections.Generic;
namespace ThisProject.Models{
public class AddIngredientsView{
public Merchant Merchant{get;set;}
public List<Ingredient> AllIngredients{get;set;}
public List<string> AddIngredientsQuantity{get;set;}
public List<bool> IsAddedIngredient{get;set;}
public List<Ingredient> NewIngredients{get;set;}
public List<double> NewIngredientsQuantity{get;set;}
public List<Pantry> PantryItems{get;set;}
}
}
家庭控制器:
[HttpGet("ingredients/new")]
public IActionResult NewIngredients(string searching){
AddIngredientsView viewModel = new AddIngredientsView();
viewModel.Merchant = context.Merchants.FirstOrDefault(m => m.id == merchantId);
viewModel.AllIngredients = context.Ingredients.ToList();
return View("newIngredients", viewModel.AllIngredients.Where(x => x.Name.Contains(searching) || searching == null).ToList());
}
最初的预期结果是所有成分的列表。当用户在 @Html.TextBox("searching") 中搜索成分时,它会过滤所有与其请求不匹配的项目。
我有十种成分在数据库中,当我在视图页面中省略 @using (Html.BeginForm....){} 之间的代码时,它们被正确调用,并简单地返回 View("newIngredients")家庭控制器。
代码在以书面形式提交时编译,但不会在浏览器中呈现。呈现页面时收到以下错误:
处理请求时发生未处理的异常。 ArgumentNullException:值不能为空。 参数名称:值
string.IndexOf(string value, int startIndex, int count, StringComparison comparisonType) ArgumentNullException:值不能为空。参数名称:值
string.IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
string.Contains(string value)
ThisProject.Controllers.HomeController+<>c__DisplayClass7_0.<NewIngredients>b__1(Ingredient x) in HomeController.cs
return View("newIngredients", viewModel.AllIngredients.Where(x => x.Name.Contains(searching) || searching == null).ToList());
System.Linq.Enumerable+WhereListIterator.ToList() System.Linq.Enumerable.ToList(IEnumerable 源) HomeController.cs中的ThisProject.Controllers.HomeController.NewIngredients(字符串搜索)
return View("newIngredients", viewModel.AllIngredients.Where(x => x.Name.Contains(searching) || searching == null).ToList());
【问题讨论】:
标签: asp.net-mvc html.beginform