ServiceStack - автозапрос и замена клиентских шаблонов

Используя Autoquery ServiceStack, у меня есть простой запрос DTO (пример ниже). Я хотел бы поменять шаблоны (Layouts), чтобы использовать другой макет Razor (согласно документации по обмену шаблонами SS здесь)?

Пример запроса DTO:

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

}

Пример макетов: шаблоны _Layout.cshtml и _PrintFriendly.cshtml

Для вышеупомянутого запроса я хотел бы поменять местами макеты на уровне клиента.

1 ответ

Решение

Все, что делает 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");
    }
}

Таким образом, вы можете сделать это в фильтре запросов, например:

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, например,g:

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

    public override void Configure(Container container) { ... }
}
Другие вопросы по тегам