在ASP.NET WebApi中修改UrlHelper.Link的GetQueryNameValuePairs()

本文关键字:Link GetQueryNameValuePairs UrlHelper 修改 ASP NET WebApi | 更新日期: 2023-09-27 18:21:59

使用ASP.NET WebApi,当我发送GET api/question?page=0&name=qwerty&other=params时,API应该在分页信封内给出结果。

为此,我想将结果和给定的page查询字符串更改为其他值。

我尝试了下面的代码,但我对此有一种不好的感觉。

protected HttpResponseMessage CreateResponse(HttpStatusCode httpStatusCode, IEnumerable<Question> entityToEmbed)
    // get QueryString and modify page property
    var dic = new HttpRouteValueDictionary(Request.GetQueryNameValuePairs());
    if (dic.ContainsKey("page"))
        dic["page"] = (page + 1).ToString();
    else
        dic.Add("page", (page + 1).ToString());
    var urlHelper = new UrlHelper(Request);
    var nextLink= page > 0 ? urlHelper.Link("DefaultApi", dic) : null;
    // put it in the envelope
    var pageEnvelope = new PageEnvelope<Question>
        {
            NextPageLink = nextLink,
            Results = entityToEmbed
        };
        HttpResponseMessage response = Request.CreateResponse<PageEnvelope<Question>>(httpStatusCode, pageEnvelope, this.Configuration.Formatters.JsonFormatter);
        return response;
    }

NextPageLink给出了一个非常复杂的结果
http://localhost/api/Question?Length=1&LongLength=1&Rank=1&SyncRoot=System.Collections.Generic.KeyValuePair%602%5BSystem.String%2CSystem.String%5D%5B%5D&IsReadOnly=False&IsFixedSize=True&IsSynchronized=False&page=1

我的问题是,

  1. 我使用Dictionary方法进行的页面处理似乎是肮脏和错误的。有更好的方法来解决我的问题吗
  2. 我不知道urlHelper.Link(routeName, dic)为什么会给出如此冗长的ToString结果。如何清除不可用的字典相关属性

在ASP.NET WebApi中修改UrlHelper.Link的GetQueryNameValuePairs()

代码中的关键问题可能是到HttpRouteValueDictionary的转换。取而代之的是,将其新建,并在循环中添加所有键值对。

这种方法可以简化很多,您可能还想考虑使用HttpActionResult(这样您就可以更容易地测试您的操作。

您还应该避免使用httproutevaluedictionary,而是编写类似的UrlHelper

urlHelper.Link("DefaultApi", new { page = pageNo }) // assuming you just want the page no, or go with the copying approach otherwise.

在哪里只需预先计算您的页面编号(并避免ToString);

将其全部写入IHttpActionResult中,该IHttpActionResult公开具有页码的int属性,这样您就可以轻松地测试操作结果,而不必考虑如何计算分页。

所以类似于:

public class QuestionsResult : IHttpActionResult
{
    public QuestionResult(IEnumerable<Question> questions>, int? nextPage)
    {
       /// set the properties here
    }
    public IEnumerable<Question> Questions { get; private set; }
    public int? NextPage { get; private set; }
    /// ... execution goes here
}

要获得页面no,请执行以下操作:

来源-http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-21

string page = request.Uri.ParseQueryString()["page"]; 

你可以在下面使用这个扩展方法(来自Rick Strahl)

public static string GetQueryString(this HttpRequestMessage request, string key)
{      
    // IEnumerable<KeyValuePair<string,string>> - right!
    var queryStrings = request.GetQueryNameValuePairs();
    if (queryStrings == null)
        return null;
    var match = queryStrings.FirstOrDefault(kv => string.Compare(kv.Key, key, true) == 0);
    if (string.IsNullOrEmpty(match.Value))
        return null;
    return match.Value;
}