Asp.net-Mvc
你如何在 asp.net mvc 中持久化查詢字元串值?
在 asp.net mvc 中保留查詢字元串值的好方法是什麼?
如果我有一個網址:/questions?page=2&sort=newest&items=50&showcomments=1&search=abcd
在分頁連結上,我想在所有連結中保留這些查詢字元串值,以便它們在使用者點擊“下一頁”時保持不變(在這種情況下,頁面值會改變,但其餘部分會保持不變)
我可以想到兩種方法來做到這一點:
- 視圖中的 Request.Querystring 並將值添加到連結
- 使用 ViewData 將每個查詢字元串值從控制器傳回視圖
這個比那個好嗎?這些是唯一的選擇還是有更好的方法來做到這一點?
我會在視圖中處理 QueryString(您的選項 #1),而不是從控制器中傳遞它。這種方法使視圖更加獨立,允許您將其轉換為視圖控制項並在不同的視圖中重複使用它。
注意:直接在視圖中訪問 QueryString 似乎違反了分離模型和視圖的設計原則,但實際上這些數據是與視圖相關的導航問題,而不是模型的一部分。
我為此使用了擴展方法:
public static string RouteLinkWithExtraValues( this HtmlHelper htmlHelper, string name, object values) { var routeValues = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values); var extraValues = new RouteValueDictionary(values); foreach (var val in extraValues) { if (!routeValues.ContainsKey(val.Key)) routeValues.Add(val.Key, val.Value); else routeValues[val.Key] = val.Value; } foreach (string key in htmlHelper.ViewContext.HttpContext.Request.Form) { routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.Form[key]; } foreach (string key in htmlHelper.ViewContext.HttpContext.Request.QueryString) { if (!routeValues.ContainsKey(key) && htmlHelper.ViewContext.HttpContext.Request.QueryString[key] != "") routeValues[key] = htmlHelper.ViewContext.HttpContext.Request.QueryString[key]; } var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext); return string.Format("<a href=\"{0}\">{1}</a>", urlHelper.RouteUrl(routeValues), name); }