首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET MVC 依時間區間查詢資料的正確姿勢:ViewModel + 查詢建構器 + 分頁

     編輯:程式設計綜合問答

常見錯誤:動作方法參數生命週期錯置

原始碼嘗試在 time(DateTime time1, DateTime time2) 中設定參數,再於 Moneydetail 直接使用 time1/time2,但 HTTP 本質無狀態,兩個 Action 互不共享區域變數。

標準解決架構

1. 查詢條件 ViewModel

public class TransactionQueryModel {
    public int? UserId { get; set; }
    public DateTime? BeginDate { get; set; }
    public DateTime? EndDate { get; set; }
    public int? AccountType { get; set; }
    public string OrderField { get; set; } = "Id Desc";
    public int PageIndex { get; set; } = 1;
    public int PageSize { get; set; } = 15;
}

2. 服務層:動態建構查詢(以 QueryBuilder 概念示意)

public PagedList GetWithdrawalDetail(TransactionQueryModel q) {
    var query = db.Finance_WithdrawalDetail.AsQueryable();
    if (q.UserId.HasValue) query = query.Where(x => x.UserId == q.UserId.Value);
    if (q.BeginDate.HasValue) query = query.Where(x => x.AddTime >= q.BeginDate.Value);
    if (q.EndDate.HasValue) query = query.Where(x => x.AddTime <= q.EndDate.Value);
    if (!string.IsNullOrEmpty(q.OrderField)) query = query.OrderBy(q.OrderField);
    return new PagedList(query, q.PageIndex, q.PageSize);
}

3. Controller 薄薄一層

[HttpGet]
public ActionResult MoneyDetail(TransactionQueryModel model) {
    if (!Request.IsAuthenticated) return RedirectToLogin();
    var data = _financeService.GetWithdrawalDetail(model);
    return View(data);
}

4. View 使用強型別分頁模型

@model PagedList
@foreach (var item in Model) { ... }
@Html.PagedListPager(Model, page => Url.Action("MoneyDetail", new { page, model.BeginDate, model.EndDate }))

關鍵優勢

  • 參數自動繫結:MVC Model Binder 直接將 QueryString/Form 對應到 ViewModel,無需手動解析。
  • 可測試性:服務層純邏輯,易於單元測試各種時間區間組合。
  • 安全性:參數化查詢防 SQL Injection,DateTime 型別自動驗證格式。
  • 分頁保持條件:Pager 連結自動帶回查詢參數,翻頁不丟失篩選條件。

避坑提醒

切勿在 Action 之間靠 TempData/Session 傳遞查詢條件,會造成重新整理、多開分頁時狀態混亂。所有查詢條件必須在 URL 中完整表達,符合 REST 風格且利於 SEO/書籤分享。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved