1

使用 ServiceStack 的自动查询,我定义了一个简单的请求 DTO(下面的示例)。我想交换模板(布局)以使用不同的 Razor 布局(根据此处的 SS 模板交换文档)?

请求 DTO 示例:

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

}

布局示例:_Layout.cshtml 和 _PrintFriendly.cshtml 模板

对于上述查询,我​​想在客户端级别交换布局。

4

1 回答 1

2

ClientCanSwapTemplatesAttribute所做的只是IRequest.Items从 HTTP 请求参数填充字典:

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 服务上使用过滤器属性,因为它们的实现是自动生成的,是创建一个自定义 AutoQuery 实现,例如:

[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 上注释时,过滤器属性也可以工作,即:

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

不鼓励使用它们,因为它们会将依赖项添加到您的服务模型中。但另一种解决方案可能是在 AppHost 构造函数中动态添加属性,例如:

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

    public override void Configure(Container container) { ... }
}
于 2017-07-03T13:09:20.400 回答