MVC:在不使用Model的情况下重新填充过滤器表单的字段

时间:2012-04-12 17:45:32

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

我需要在一个View中重新填充一种过滤器,我不能使用Model这样做(已经使用Model来引入一个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,所以我想知道是否有办法以复数方式执行此操作。

提前致谢。

2 个答案:

答案 0 :(得分:3)

我知道你说的不使用模型,但你的理由是你当前的模型是一个表的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

答案 1 :(得分:3)

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)