我創建了一個QueryBase類,以便在需要時支持Paging和Sorting。用於Paging + Sorting的ServiceStack QueryBase類,但未驗證驗證
public class QueryBase
{
public string Sort { get; set; }
public int PageNumber { get; set; }
public int PageSize { get; set; }
}
如果一個類支持這些功能,它會只是這樣的擴展它:
public class Cars: QueryBase, IReturn<CarsResponse>
{
}
public class CarsResponse : IHasResponseStatus
{
public List<Car> Cars { get; set; }
public ResponseStatus ResponseStatus { get; set; }
}
然後才能從查詢字符串填補QueryBase我創建在需要時可以使用RequestFilterAttribute :
public class QueryRequestFilterAttribute : Attribute, IHasRequestFilter
{
#region IHasRequestFilter Members
public IHasRequestFilter Copy()
{
return this;
}
public int Priority
{
get { return -100; }
}
public void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto)
{
var request = requestDto as QueryBase;
if (request == null) { return; }
request.PageNumber = req.QueryString["pageNumber"].IsEmpty() ? 1 : int.Parse(req.QueryString["pageNumber"]);
request.PageSize = req.QueryString["pageSize"].IsEmpty() ? 15 : int.Parse(req.QueryString["pageSize"]);
request.Sort = req.QueryString["sort"].IsNullOrEmpty() ? "id" : req.QueryString["sort"];
}
#endregion
}
一切工作正常,但現在我的目標是實現驗證,以便確定像maxpagesize可或minpagenumber一些基本規則。 一個非常基本的實現是:
public class QueryBaseValidator : AbstractValidator<QueryBase>
{
public QueryBaseValidator()
{
RuleFor(query => query.PageSize).LessThanOrEqualTo(100).GreaterThan(0);
}
}
這樣驗證過濾器無法找到上述在其緩存中驗證,因爲它搜索汽車,而不是QueryBase(第11個ValidationFilter.cs):
ValidatorCache.GetValidator(req, requestDto.GetType());
這個問題的最佳解決方案是什麼,以避免在每個子類中編寫相同的驗證邏輯?
我不明白需要使用RequestFilter。由於您從QueryBase繼承 - Cars已具有正確的屬性,因此可以將它們用作查詢參數。您在過濾器中提供的默認值可以在構造函數中設置。對 ? – 2015-06-17 14:22:12