【问题标题】:ASP.NET MVC Select Distinct Values into Dropdown for filter, retain valuesASP.NET MVC 将不同的值选择到下拉列表中进行过滤,保留值
【发布时间】:2017-12-18 20:06:00
【问题描述】:

我有一个基本的 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());
}

【问题讨论】:

  • 你能发布你的部分代码吗?喜欢控制器部分和视图?
  • 您需要在控制器方法中通过从包含您想要的值的数据库表中生成值来生成您的SelectList。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    基本上,我所做的就是在视图中添加这个

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

    在控制器中,我确定了其中一个参数是什么“字符串区域”,以这种方式选择的值作为字符串通过,我可以对其进行过滤。

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

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

    最后一个“区域”参数设置列表的选定值,因此当它在视图中呈现时,它会自动选择您选择的最后一个值

    我不确定人们在使用 viewbag 进行此类操作时会遇到什么样的问题。它比使用任何类型的 TempData 对象要好,因为如果您使用多个选项卡/窗口,后者会导致问题。对于一个非大量使用的内部应用程序,这似乎工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多