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