【问题标题】:MVC: Repopulate filters form's fields without using ModelMVC:在不使用模型的情况下重新填充过滤器表单的字段
【发布时间】:2012-04-12 17:45:32
【问题描述】:

我需要在无法使用模型的视图中重新填充一种过滤器(为了创建表,已经使用模型带来对象的 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,所以我想知道是否有办法以复数方式做到这一点。

提前致谢。

【问题讨论】:

  • 您可以在 ViewData、ViewBag 或 TempData 的一部分中传递模型。将所有这些属性移动到 FilterModel 并将模型作为 ViewData 的一部分传递
  • 有什么例子吗?我的意思是,不确定该解决方案的语法是什么。
  • @Umagon - 语法?您只需创建一个包含所有过滤器属性的包装模型类。然后你将该类的一个实例分配给 ViewBag.Filters 或其他东西,然后在你的视图中使用 ViewBag.Filters.hasta 或 ViewBag.Filters.origen
  • 哦。我误解了答案。看起来不错,但在这种情况下,我想我会使用上面的答案。无论如何,感谢两者!
  • 这应该作为答案,这是一个很好的方法。

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


【解决方案1】:

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) 

【讨论】:

  • 哇,这看起来很整洁。我最喜欢最后一个。我想我会改用这个,因为也许有了这个我还可以解决我需要制作的其他很多过滤器视图。谢谢。
【解决方案2】:

我知道您说没有使用模型,但您的理由是您当前的模型是表的 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

【讨论】:

  • 这比上面评论中提到的 ViewBag 方法更受欢迎。
  • 谢谢,我认为这将更容易和更清洁。
  • 没问题,只是出于兴趣,您为什么撤销接受我的回答? :)
  • 我接受了实际接受的答案;我改用这种方法。应用于我的情况,这对我有更好的帮助。无论如何,谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
相关资源
最近更新 更多