1

我有一個ApiController,返回OkNegotiatedContentResult<T>與資源收集,分頁。當然,會有更多方法返回分頁集合。如何提供額外的方法來返回IHttpActionResult?

的所有這些行動的結果content看起來大致是這樣的:

  • 一個Data屬性與當前項目
  • 一個PagingMeta財產分頁元數據,如總頁數,總項目
  • A PagingLinks屬性包含第一頁/上一頁/下一頁/最後一頁的鏈接

我的後端r會產生一個自定義的PagedList<T>對象,而我有另一個PagedListResponse<T>包含上述屬性。這是一個從一個到另一個的簡單轉換。

現在,在網絡API中,ApiController提供了一些方便的方法返回IHttpActionResult,如:

  • Ok<T>(T value)
  • Content<T>(HttpStatusCode statusCode, T value)

我希望使它就像便於控制器輕鬆返回分頁結果。

目前我有一個擴展方法,提供它具有以下特徵:

public static OkNegotiatedContentResult<PagedListResult<T>> OkPaged<T>(this ApiController controller, /* other parameters */) 

「醜陋」是,你只能通過包括this關鍵字調用擴展方法:

return this.OkPaged(myResult); 

我能看到的唯一的其他選擇是實現一個基類控制器類,但我通常會盡量避免這種繼承結構,因爲它們往往會在後來變得麻煩。

ASP.NET在擴展點方面做了什麼來做我想做的事情?

回答

0

你總是可以創建一個從IHttpActionResult繼承的類並使用它作爲你的返回值,如

public class HttpStatusCodeResultWithContent<T> : IHttpActionResult 
{ 
    private readonly HttpRequestMessage httpRequestMessage; 

    private readonly HttpStatusCode statusCode; 

    public HttpStatusCodeResultWithContent(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode, T model) 
    { 
     this.httpRequestMessage = httpRequestMessage; 
     this.statusCode = statusCode; 
     ResponseModel = model; 
    } 

    public T ResponseModel { get; private set; } 

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     var response = httpRequestMessage.CreateResponse(statusCode, ResponseModel); 
     return Task.FromResult(response); 
    } 
} 

這讓你在HttpStatusCodeResultWithContent一個容易測試類,允許你返回任何任何內容HTTP狀態碼。

從控制器代碼

然後,

var pagedListResult = someObject.GetPagedList(); 
return new HttpStatusCodeResultWithContent<PagedListResult<T>(Request, HttpStatusCode.OK, pagedListResult); 

然後,您可以使用擴展方法,如果你喜歡上ApiController訪問包到這一點 - 這幾乎是所有這回事裏面ApiController,例如這裏是ApiController的'Ok'方法。

protected internal virtual OkNegotiatedContentResult<T> Ok<T>(T content) 
{ 
    return new OkNegotiatedContentResult<T>(content, this); 
} 
相關問題