1

使用ServiceStack的自動查詢我有一個簡單的請求DTO定義(例如下面)。我想交換模板(佈局)以使用不同的Razor佈局(根據SS模板交換文檔here)?ServiceStack - 自動查詢和交換客戶端模板

請求DTO的實施例:佈局的

Route("/customers", "GET")] 
public class QueryCustomers : QueryDb<FindFilesResponse> 
{ 

} 

實施例: _Layout.cshtml和_PrintFriendly.cshtml模板

對於上述查詢我想在客戶端級別交換佈局。

回答

2

所有ClientCanSwapTemplatesAttribute確實是填充從HTTP請求參數的IRequest.Items詞典:

public class ClientCanSwapTemplatesAttribute : RequestFilterAttribute 
{ 
    public override void Execute(IRequest req, IResponse res, object requestDto) 
    { 
     req.Items["View"] = req.GetParam("View"); 
     req.Items["Template"] = req.GetParam("Template"); 
    } 
} 

所以,你可以選擇這樣做的Request Filter,如:

RegisterTypedRequestFilter<QueryCustomers>((req, res, dto) => 
{ 
    req.Items["View"] = req.GetParam("View"); 
    req.Items["Template"] = req.GetParam("Template"); 
}); 

或者以能夠在AutoQuery Services上使用Filter Attributes,因爲它們的實現是自動生成的,即創建一個Custom AutoQuery implementation,例如:

[ClientCanSwapTemplates] 
public class MyQueryServices : Service 
{ 
    public IAutoQueryDb AutoQuery { get; set; } 

    //Override with custom implementation 
    public object Any(QueryCustomers query) 
    { 
     var q = AutoQuery.CreateQuery(query, base.Request); 
     return AutoQuery.Execute(request, q); 
    } 
} 

雖然在請求註解當過濾器的屬性也將工作DTO,I,E:

[ClientCanSwapTemplates] 
[Route("/customers", "GET")] 
public class QueryCustomers { ... } 

他們使用的是沮喪,因爲它們會增加依賴於您的服務模式。但另一種解決方案可能是在您的AppHost構造函數中的add Attributes dynamically,e,g:

public class AppHost : AppHostBase 
{ 
    public AppHost() 
    { 
     typeof(QueryCustomers) 
      .AddAttributes(new ClientCanSwapTemplatesAttribute()); 
    } 

    public override void Configure(Container container) { ... } 
}