Как использовать шаблоны ServiceStack для поддержки динамических результатов в зависимости от типа запроса? - PullRequest
2 голосов
/ 27 марта 2019

С помощью Razor Story ServiceStack у нас есть множество способов выбрать, какой Razor View мы хотим использовать для рендеринга страницы. Еще лучше, и в моем случае важно, что мы можем передать заголовок Content-Type (или параметр строки запроса, или даже «суффикс» страницы), а также вернуть необработанную модель в разнообразных форматах .

Есть ли способ использовать Шаблоны ServiceStack (теперь известный как SharpScript ), чтобы сделать то же самое? Я следую примеру здесь , но я просто получаю ответ в стандартном формате HTML. Он не использует мой шаблон, как бы он ни назывался.

Следуя примеру в примечаниях к выпуску v5.5 :

[Route("/hello/{Name}")]
public class Hello : IReturn<HelloResponse>
{
    public string Name { get; set; }
}
public class HelloResponse
{
    public string Result { get; set; }
}

public class HelloService : Service
{
    public object Any(Hello request) => new HelloResponse { Result = $"Hello, {request.Name}!" };
}

Переход к /hello/World?format=html предоставляет мне стандартный отчет в формате HTML, а не мой шаблон. Я последовал другому примеру, чтобы заставить его использовать шаблон ....

public object Any(Hello request) =>
        new PageResult(Request.GetPage("examples/hello")) {
            Model = request.Name
        };

... и он ВСЕГДА возвращает мой шаблон, даже если я укажу /hello/World?format=json.

Есть ли способ выбора вида Razor для страниц ServiceStack + ScriptSharp, но также поддержка различных форматов ответов?

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Трудно ответить на такой неопределенный вопрос, как этот, без подробностей о конкретном сценарии, которого вы хотите достичь, и который не работает.

Вы можете вернуть Sharp Pages несколькими способами:

  • Когда он запрашивается непосредственно как страница содержимого, например, /dir/page -> /dir/page.html
  • Использование Маршрутизация на основе страницы , например, /dir/1 -> /dir/_id.html
  • В качестве Просмотр страницы в ответ на Услугу, когда она названа в честь Запрос DTO или Ответ DTO , например /contacts/1-> /Views/GetContact.html или /Views/GetContactResponse.html

Выберите, какое представление следует визуализировать внутри вашей Службы, вернув свой DTO Response внутри пользовательского HttpResult:

public object Any(MyRequest request)
{
    ...
    return new HttpResult(response)
    {
        View = "CustomPage",  // -> /Views/CustomPage.html
        //Template = "_custom-layout",
    };
}

Добавьте [ClientCanSwapTemplates] Атрибут «Запросить фильтр», позволяющий изменить представление и шаблон в QueryString, например: ?View=CustomPage&Template=_custom-layout

[ClientCanSwapTemplates]
public object Any(MyRequest request) => ...

Выбор страницы, которую вы хотите отобразить внутри вашей службы контроллера представления модели возвращая пользовательский PageResult:

public class CustomerServices : Service
{
    public object Any(ViewCustomer request) =>
        new PageResult(Request.GetPage("examples/customer")) {
            Model = TemplateQueryData.GetCustomer(request.Id)
        };
}

Примечание: SharpPagesFeature разрешает страницы с помощью yoтвой каскад AppHost.VirtualFileSources.В .NET Core он настроен на использование WebRoot , например, /wwwroot.

. Для Sharp Pages возвращает свой ответ в нескольких типах контента:

, а также возвращает необработанную модель в различных форматах.

Вам необходимо использовать Sharp API , значение которых return, например / hello/_name/index.html:

{{ { result: `Hello, ${name}!` } | return }}
1 голос
/ 28 марта 2019

Чтобы кратко ответить на мой собственный вопрос, мне нужен был первый вариант @mythz. После вызова Plugins.Add(new SharpPagesFeature()) в моем AppHost мне нужно было вернуть HttpResult из моего метода обслуживания:

public object Any(MyRequest request)
{
    ...
    return new HttpResult(response)
    {
        View = "CustomPage",  // -> /Views/CustomPage.html
        //Template = "_custom-layout",
    };
}
...