在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
我的问题是,
- 我使用
Dictionary
方法进行的页面处理似乎是肮脏和错误的。有更好的方法来解决我的问题吗 - 我不知道
urlHelper.Link(routeName, dic)
为什么会给出如此冗长的ToString结果。如何清除不可用的字典相关属性
代码中的关键问题可能是到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;
}