Asp.net-Mvc

你如何在 asp.net mvc 中持久化查詢字元串值?

  • March 1, 2018

在 asp.net mvc 中保留查詢字元串值的好方法是什麼?

如果我有一個網址:/questions?page=2&sort=newest&items=50&showcomments=1&search=abcd

在分頁連結上,我想在所有連結中保留這些查詢字元串值,以便它們在使用者點擊“下一頁”時保持不變(在這種情況下,頁面值會改變,但其餘部分會保持不變)

我可以想到兩種方法來做到這一點:

  1. 視圖中的 Request.Querystring 並將值添加到連結
  2. 使用 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);
   }

引用自:https://stackoverflow.com/questions/889732