问题描述
由于我无法访问最初的堆栈溢出帐户而再次发布。最初的问题发布于here。不便之处,敬请原谅。
如何阅读请求标头?我想查找并阅读一个说“已排序”的键,如果是,则返回所有书籍/实体的已排序版本。我也不确定如何返回已排序的实体。我了解这似乎很奇怪,但这是我的分配规范的一部分,否则我将使用[FromRoute]
属性从URL获取一个参数。 This似乎不适合我。 This是另一个旧问题,因为我无法将请求标头键与string或null进行比较,因此该问题也不起作用。这是我当前的代码:
// GET: api/Books
[HttpGet]
public async Task<ActionResult<IEnumerable<Book>>> GetAllBooks()
{
if (Request.Headers["sorted"] == true)
{
}
return await _context.Books.ToListAsync();
}
public class Book
{
[Key]
public long id { get; set; }
public long libraryId { get; set; }
public string title { get; set; }
public string author { get; set; }
public string description { get; set; }
}
编辑:添加了图书实体
解决方法
您可以这样实现:
if (Request.Headers.TryGetValue("sorted",out StringValues sortedValue)
&& bool.TryParse(sortedValue,out bool isSorted))
{
if(isSorted)
{
return await _context.Books.OrderByDescending(a => a.Id).ToListAsync();
}
}
return await _context.Books.OrderBy(a => a.Id).ToListAsync();
您要写TryGetValue
和TryParse
的原因是,如果值是exceptions
或值不是missing/null
,请避免使用boolean
。
,根据您的逻辑,您可以按ascending or descending
的顺序对图书进行排序,也可以根据您想要的property
对图书进行排序,例如:ID,标题,作者或发布日期...等。
或者为简单起见,您可以将支票更改为:
if (bool.TryParse(Request.Headers["sorted"],out bool isSorted) && isSorted){
return await _context.Books.OrderByDescending(a => a.Id).ToListAsync();
}
return await _context.Books.OrderBy(a => a.Id).ToListAsync();