【问题标题】:Filtering the data at the controller before it is rendered in a view在视图中呈现数据之前在控制器处过滤数据
【发布时间】:2015-12-17 20:26:18
【问题描述】:
  1. 您好,我对 MVC5、Razor 和 EF非常陌生,我已经找了两天了,但仍然无法找到解决问题的方法。
  2. 我想做的是查看用户输入年份、季度和部门的位置。在提交时,我想要另一个视图的控制器来查看这些参数并在呈现视图之前过滤数据。目前我有 5 个不同的部门,我想在渲染视图时只过滤一个部门。
  3. 我查看了很多论坛、网站等,试图弄清楚这一点,但我没有任何运气。我很高兴至少能指出正确的方向。我正试图通过跳入火中自己弄清楚这一点来学习这一点,但我现在需要帮助。
  4. 我了解 MVC 的工作原理,我在使用 DB 时没有遇到任何问题,并且我成功地学习了脚手架的工作原理以及 ViewModel 的工作原理。我现在正在尝试学习如何操作控制器和视图中的数据。任何帮助将不胜感激。
  5. 查看1 - 只是为了输入参数

    <p> Enter Year: @Html.TextBox("Year")</p>
    <p> Enter Quarter: @Html.TextBox("Qtr")</p> 
    <p> Enter Division: @Html.TextBox("Div")</p>
    <p><input id="Submit" type="button" value="button" /></p>
    
  6. 视图 2 的控制器

    namespace BSIntranet.Controllers
    {
        public class DivisionIncomeController : Controller
        {
            private ProjectionsEntities db = new ProjectionsEntities();
    
            // GET: DivisionIncome
            public ActionResult Index()
            {
                return View(db.JobRecaps.ToList());
            }
        }
    }
    

我不知道从这里开始什么或如何开始。谢谢你的帮助!!

编辑 使用系统; 使用 System.Collections.Generic;

public partial class JobRecap
{
    public int ID { get; set; }
    public string Job_ID { get; set; }
    public int Year { get; set; }
    public int Qtr { get; set; }
    public string Div { get; set; }
    public string PreparedBy { get; set; }
    public string ReviewedBy { get; set; }
    public Nullable<System.DateTime> Date { get; set; }
    public Nullable<System.DateTime> ProjStart { get; set; }
    public Nullable<System.DateTime> ProjComp { get; set; }
    public string SvgsSplit { get; set; }
    public Nullable<int> OwnerSplit { get; set; }
    public Nullable<int> BSSplit { get; set; }
    public string JointVent { get; set; }
    public Nullable<int> BSPct { get; set; }
    public string ContractType { get; set; }
    public string ContractWritten { get; set; }
    public Nullable<decimal> CurContrAmt { get; set; }
    public string FeeBasis { get; set; }
    public Nullable<decimal> EstTotFeePct { get; set; }
    public Nullable<decimal> EstTotFeeAmt { get; set; }
    public string PreconFeeBasis { get; set; }
}

【问题讨论】:

  • 查看模型的代码会有所帮助。你能补充一下吗?
  • 你可能会发现这篇文章很有帮助Filter/Search using Multiple Fields - ASP.NET MVC
  • 是的,我见过这种方法,但我想在呈现之前过滤视图,而不是在页面加载后过滤它。不过还是谢谢你的建议!!
  • 它在页面呈现之前过滤数据。
  • 您是否考虑过使用单独的视图模型类,该类仅包含您想要从模型中获取的信息并将其传递给视图引擎?创建可以有效过滤您的内容。

标签: c# asp.net-mvc razor


【解决方案1】:

为简单起见,您只需将 int? Year, int? Qtr, string Div 参数添加到您的 Index 操作并使用它们进行搜索:

public ActionResult Index(int? Year, int? Qtr, string Div)
{
    var data= db.JobRecaps.AsQueryable();
    if(Year.HasValue)
        data= data.Where(x=>x.Year == Year);
    if(Qtr.HasValue)
        data= data.Where(x=>x.Qtr == Qtr );
    if(!string.IsNullOrEmpty(Div))
        data= data.Where(x=>x.Div == Div );   

    return View(data.ToList());
}

注意:

您还可以分离关注点并创建一个包含这些搜索参数的JobRecapSearchModel,并将其用作操作参数,还可以使用我上面使用的业务创建一个包含List&lt;JobRecap&gt; Search(JobRecapSearchModel searchMode) 方法的JobRecapBusinessLogic 类。这样,您将拥有一个更灵活、更美观的控制器。

要了解更多关于如何使用这种方法和好处,你可以看看这个问题:

【讨论】:

  • 这在技术上并不重要,但AsQueryable 是不必要的。 db.JobRecaps 返回一个 IQueryable
  • 谢谢你,Reza....花了一点时间才弄明白,但我明白你在说什么。我对此很陌生!
  • @ChrisPratt 感谢您的评论,重要的是 OP 知道我们可以使用 var data=db.JobRecaps.AsQueryable()IQueryable&lt;JobRecap&gt; data=db.JobRecaps; 但使用 var data = db.JobRecaps; 然后 data=data.Where(...) 会导致编译时错误,因为类型数据将是DbSet&lt;JobRecap&gt;,这样我们就不能将data.Where(...)分配给data
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多