2009-05-20 104 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的其他路由值。