我尝试使用标记
创建下拉列表 <select name="manufacturer" class="form-control">
<option>@null</option>
@foreach (var item in Model) {
<option>@item.Manufacturer</option>
}
</select><br>
但是这是一个问题:它不会填充所有可用的manufacturers
,只显示当前页面中的项目。示例:http://i.imgur.com/na0x5eQ.png
那是因为它使用从控制器传递的模型,该模型并不总是包含数据库中的每个项目。 (因为分页或搜索后)
以下是partial view
@model IPagedList<Products>
@using PagedList
@using PagedList.Mvc
<div id="filter" class="left">
@using (Html.BeginForm("Filter", "SearchFilter")) {
<div>
<b>Manufacturer:</b> <br>
<select name="manufacturer" class="form-control">
<option>@null</option>
@foreach (var item in Model) {
<option>@item.Manufacturer</option>
}
</select><br>
<b>Name:</b> <br>@Html.TextBox("name", null)<br>
<b>Price From:</b> <br>@Html.TextBox("min", null)<br>
<b>To:</b> <br>@Html.TextBox("max", null)<br>
<button type="submit" value="search"><b>Search</b></button>
</div>
}
</div>
那么解决这个问题的方法是什么?
答案 0 :(得分:0)
既然你知道它为什么会发生
这是因为它使用从控制器传递的模型,该模型并不总是包含数据库中的每个项目。 (因为分页或搜索后)
然后为什么不在那里解决它。也许您需要为制造商提供单独的验证表(如果您还没有制造商)。
型号:
public class ProductsModel
{
public IPagedList<Products> CurrentProducts {get; set;}
public int ManufacturerId {get; set;}
public int MinPrice{get; set;}
public int MaxPrice{get; set;}
}
控制器操作:
[HttpGet]
public ViewResult CurrentProducts()
{
ProductsModel model = new ProductsModel();
model.CurrentProducts = _repository.Product;
ViewBag.ManufacturerId = from p in _repository.Product select p.Manufacturer;
return View(model);
}
[HttpPost]
public ViewResult CurrentProducts(ProductsModel model)
{
if(ModelState.IsValid)
{
model.CurrentProducts = _repository.Product.Where(t=>t.ManufacturerId == model.ManufacturerId);
ViewBag.ManufacturerId = from p in _repository.Product select p.Manufacturer;
}
return View(model);
}
在视图中,创建一个如下所示的下拉列表:
@model MyNameSpace.ProductsModel
@Html.DropDownListFor(model=> model.ManufacturerId, string.Empty);