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) { ... } 
}