ASP.NET MVC选择不同的值进入下拉列表以进行过滤,保留值

时间:2017-12-18 20:06:01

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

我有一个基本的MVC索引视图,带有一个简单的文本框用于搜索,它工作正常。我想添加一个下拉列表过滤器,以便从其中一个字段中提取不同的值。我通过使用这样的文章来实现它:

MVC - DropDown containing all distinct values for one field in database?

您只需遍历模型中的不同值。问题是,一旦您选择了一个值并且表单提交,它就会过滤得很好,但现在下拉列表只包含一个值(当前选中的值),因为现在您的视图已被过滤。

是否有一种简单的方法可以保留原始值或在视图中使用Razor告诉它重新搜索没有过滤器的模型以填充下拉列表?

这是视图的一部分

@model IEnumerable<KPI_OnlineBilling_MVC.Models.OBProjectRequisition>

 @Html.DropDownList("region", new SelectList(Model.Select(i => i.MMRegion).Distinct().ToList()), new { onchange = "this.form.submit();" })

并且控制器基本上是

public ActionResult Index(string searchString, string Regions)
{
var requisitions = from s in db.OBProjectRequisitions select s;
if (!String.IsNullOrEmpty(Regions))
{
requisitions = requisitions.Where(s => s.MMRegion.Contains(Regions));
}

return View(requisitions.ToList());
}

2 个答案:

答案 0 :(得分:0)

您通常需要以与初始查看操作完全相同的方式重新填充模型(或viewdata)。

答案 1 :(得分:0)

基本上,我所做的是在视图中添加它

@Html.DropDownList("Regions", "* ALL")

在控制器中,我确定了一个参数是什么&#34;字符串区域&#34;这样,所选的值作为字符串出现,我可以对其进行过滤。

var regions = new SelectList(
db.ModelStuffs.Select(r => r.Region).Distinct().OrderBy(Region => Region).ToList(), Regions);

ViewBag.Regions = regions;
是的,是的,是的。我知道人们讨厌使用viewbag,但这是将数据传递给视图的最简单方法,否则根据视图本身过滤数据会导致当前过滤的项目显示在下拉列表中

最后&#34;地区&#34;参数设置列表的选定值,以便在视图中呈现时,它会自动选择您选择的最后一个值

我不确定人们使用viewbag这样的问题会有什么样的问题。它比使用任何类型的TempData对象更好,因为如果您使用多个选项卡/窗口,后者将导致问题。对于非常常使用的内部应用程序,这似乎工作正常。