我試圖在MVC控制器中實現過濾和分頁。我使用ViewBag將信息傳遞給View。將過濾器作爲查看對象傳遞給控制器
Filter類是這樣的:
public class Criteria
{
public int? SnapshotKey { get; set; }
public string Delq { get; set; }
public override string ToString()
{
string[] Ares = new string[2];
if (SnapshotKey.HasValue)
Ares[0] = "SnapshotKey=" + SnapshotKey.ToString();
if (!String.IsNullOrWhiteSpace(Delq))
Ares[1] = "Delq=" + Delq;
return String.Join("&", Ares.Where(s => !string.IsNullOrWhiteSpace(s)));
}
}
我控制器的方法是這樣的:
public ActionResult Search(Criteria filter, string filterString,
int pageNo = 1, int pageSize = 5)
{
using (DemoDBEntities db = new DemoDBEntities())
{
var list = db.BMH.AsQueryable();
if (filter != null)
{
if (filter.SnapshotKey.HasValue)
list = list.Where(r => r.SnapshotKey == filter.SnapshotKey.Value);
if (!String.IsNullOrWhiteSpace(filter.Delq))
list = list.Where(r => r.Delq == filter.Delq);
}
list = list.OrderBy(r=>r.SnapshotKey).Skip((pageNo - 1) * pageSize).Take(pageSize);
ViewBag.Criteria = filter.ToString();
ViewBag.CriteriaString = filterString;
ViewBag.PageNo = pageNo;
return View(list.ToList());
}
}
據我所知,我無法通過ViewBag作爲一個對象來控制,這就是爲什麼我用filter.ToString( )來存儲當前的過濾器。
在視圖中,我有以下鏈接轉到特定頁面,同時保留當前過濾器。
@Html.ActionLink("Next Page", "Search", new { filter = ViewBag, filterString = ViewBag.CriteriaString, pageNo = ViewBag.PageNo + 1, pageSize = 5 })
所以當從View返回時,我得到當前的過濾器作爲字符串。現在在控制器中,我需要將字符串轉換爲Criteria類。這是可行的,但我正在尋找一個更體面的方式來做我所需要的。
爲什麼不只是'新{SnapshotKey = ViewBag.SnapshotKey,Delq = ViewBag.Delq,幫您做生意= ViewBag.PageNo + 1 ...}'(你可以通過在模型中添加'pageNo'和'pageSize'來簡化它,所以POST方法只是'public ActionResult Search(Criteria filter)' –
我試圖不依賴如果我在Criteria類中添加了一個新字段,這是否有意義呢? – FLICKER
好吧,如果你添加一個新字段,那麼你需要更新'.ToString()'方法(即有些東西需要更新)。你總是可以將'pageNo'和'pageSize'添加到'Criteria'模型中,並將它們包含在'ToString()'方法中,然後使用'Next Page' –