MVC:在不使用模型的情况下重新填充筛选器表单的字段

本文关键字:填充 筛选 字段 表单 新填充 情况下 模型 MVC | 更新日期: 2023-09-27 18:30:59

我需要在视图中重新填充一种形式的过滤器,其中我无法使用模型来执行此操作(已经使用模型带来对象的 IEnumerable,以便创建表)。

如何填充筛选器输入,以便用户不必自己填写?

我正在使用 ASP.NET MVC3。

图形示例,因此更清晰:

public ViewResult Consulta(string dominio, string cliente, DateTime?
desde, DateTime? hasta, int? estado, string origen, int? reclamoid)
{
    var reclamos = db.Reclamos.Where(/*Apply filters, etc*/);
    return View(reclamos.ToList());
}

如您所见,这些太多了,无法为每个过滤器使用一个 ViewBag,所以我想知道是否有办法以复数方式做到这一点。

提前谢谢。

MVC:在不使用模型的情况下重新填充筛选器表单的字段

Mattytommo 有一个如何创建一个新的复杂模型的例子来做到这一点,但我还有另外两种方法。

首先是创建一个定义更好的复杂模型,因为这会给你一个定义更明确的模型。它包含您的过滤器和孤立的结果。

 public class MyFilterModel
 {
     public string Dominio { get; set; } 
     public string Cliente { get; set; } 
     public DateTime? Desde { get; set; } 
     public int? Estado { get; set; } 
     public string Origen { get; set; } 
     public int? Reclamoid { get; set; }  
 }
 public class MyViewModel
 {
      public MyFilterModel Filters {get;set;}
      public IEnumerable<DataRow> Results {get;set;}
 }

另一种选择是保留现有模型,但使用 ViewBag 或 ViewData 传递筛选器模型:

 public class MyFilterModel
 {
     public string Dominio { get; set; } 
     public string Cliente { get; set; } 
     public DateTime? Desde { get; set; } 
     public int? Estado { get; set; } 
     public string Origen { get; set; } 
     public int? Reclamoid { get; set; }  
 }

在控制器中

 public ViewResult Consulta(MyFilterModel filters)  
 {  
      ViewBag.Filters = filters;
     var reclamos = db.Reclamos.Where(/*Apply filters, etc*/);  
     return View(reclamos.ToList());  
 } 

在您看来

 @model MyViewModel
 @{
      MyFilterModel filters = ViewBag.Filters as MyFilterModel;
 }
 @Html.EditorFor(m => filters.Dominio) 

我知道你说没有使用模型,但你的推理是你当前的模型是一个表格的 IEnumerable。为什么不创建一个视图模型,该模型将您当前的 IEnumerable 作为属性以及您需要的其余属性?比使用 ViewBag 更好的做法。

像这样:

public class MyViewModel
{
    public IEnumerable<RowData> TableRows { get; set; } //your table rows
    public string Dominio { get; set; }
    public string Cliente { get; set; }
    public DateTime? Desde { get; set; }
    public int? Estado { get; set; }
    public string Origen { get; set; }
    public int? Reclamoid { get; set; } 
}

然后在您的视图中将模型声明为:

@model MyViewModel

然后,您可以在视图中执行以下操作:

@Html.EditorFor(m => m.Dominio)
//then editors for the rest of the model fields
//then you can populate your tablerows using Model.TableRows