2009-05-20 106 views
12

什麼是在asp.net mvc中保存查詢字符串值的好方法?如何在asp.net mvc中持續查詢字符串值?

如果我有一個網址: /問題網頁= 2 &排序=最新&項目= 50個& showcomments = 1個&搜索= ABCD

在分頁鏈接我要保留這些查詢字符串值中的所有鏈接所以他們堅持當「下頁」,例如用戶點擊(在這種情況下,頁面的值會發生變化,但是其餘的將保持不變)

我能想到的2種方法來做到這一點:

  1. 的Request.QueryString在視圖和值添加到使用的ViewData

是其中一個比另一個更好的聯繫

  • 從控制器通過每個查詢字符串值回觀?這些是唯一的選擇還是有更好的方法來做到這一點?

  • 回答

    6

    我將處理在視圖中查詢字符串(您的選擇#1),而不是在它傳遞從控制器。這種方法使視圖更加獨立,允許您將其轉換爲視圖控件,並在不同的視圖中重用它。

    注意:直接在視圖中訪問QueryString可能看起來違反了分離模型和視圖的設計原則,但實際上這些數據是與視圖相關的導航問題,而不是真正的部分模型。

    1

    我只是保持會話中的值,這種方式尋呼鏈接只需要有;

    /問題?頁= 2

    /問題?頁= 3

    的一個原因,我不會我們的查詢字符串是因爲我不希望用戶看到我傳遞給程序的價值觀。這讓他們很容易進入地址欄,並開始更改值以「查看會發生什麼」。有了這段代碼,他們所能做的就是改變頁碼。

    +0

    這是我想了一會兒,但想保持在查詢字符串中。 – dtc 2009-05-20 23:08:12

    +0

    你想在查詢字符串中離開&sort = newest&items = 50&showcomments = 1&search = abcd的一個很好的理由是,人們可以爲搜索添加書籤。是否有任何理由不希望人們直接編輯querysting中的&search =值並「查看會發生什麼」? – 2013-01-30 00:40:52

    8

    我使用的是擴展方法爲:

    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); 
        } 
    
    +0

    我從來沒有想到這一點。它看起來很有趣,但對我來說可能太複雜了。我希望有一些MVC約定可以做到這一點,而不必編寫代碼行。 – dtc 2009-05-20 23:09:39

    0

    這裏是我如何做它在Asp.Net核心,首先查詢字符串參數分配給你的控制器ViewBags:

    [HttpGet("/[controller]/[action]/{categoryId?}/{contractTypeId?}/{locationId?}")] 
    public IActionResult Index(Guid categoryId, int contractTypeId, Guid locationId) 
    { 
        ViewBag.CategoryId = categoryId; 
        ViewBag.ContractTypeId = contractTypeId; 
        ViewBag.LocationId = locationId; 
    
        ... 
    } 
    

    然後值傳遞給你的鏈接,像這樣:

    <a asp-action="Index" asp-controller="Jobs" 
        asp-route-categoryId="@teachingCategory.Id" 
        asp-route-contractTypeId="@ViewBag.ContractTypeId" 
        asp-route-locationId="@ViewBag.LocationId"> 
        @teachingCategory.Description (@teachingCategory.Rank) 
    </a> 
    
    <a asp-action="Index" asp-controller="Jobs" 
        asp-route-categoryId="@ViewBag.CategoryId" 
        asp-route-contractTypeId="@typeOfEmployment.Id" 
        asp-route-locationId="@ViewBag.LocationId"> 
        @typeOfEmployment.Name 
    </a> 
    
    <a asp-action="Index" asp-controller="Jobs" 
        asp-route-categoryId="@ViewBag.CategoryId" 
        asp-route-contractTypeId="@ViewBag.ContractTypeId" 
        asp-route-locationId="@item.Id"> 
        @item.Id 
    </a> 
    

    請注意,每個鏈接都保留其自己的實際值,並通過我們傳遞給ViewBag的其他路由值。