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,所以我想知道是否有办法以复数方式做到这一点。
提前谢谢。
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