我需要在一个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,所以我想知道是否有办法以复数方式执行此操作。
提前致谢。
答案 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)