如何使用ServiceStack模板支持基于请求类型的动态结果?

时间:2019-03-27 20:37:33

标签: servicestack servicestack-razor

使用ServiceStack's Razor Story,我们可以通过多种方式来选择要用于渲染页面的Razor View。在我的情况下,更好甚至更关键的是,我们还可以传入Content-Type标头(或查询字符串参数,甚至页面“后缀”),以在variety of formats中返回原始模型。

是否有任何方法可以使用ServiceStack Templates(现在称为SharpScript)来执行相同的操作?我按照示例here进行操作,但是我只是返回标准的HTML格式响应。无论如何命名,它都不会使用我的模板。

遵循v5.5 Release Notes中的示例:

[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,它也总是返回我的模板。

有什么方法可以为ServiceStack + ScriptSharp页面提供类似Razor的视图选择,还可以支持不同的响应格式?

2 个答案:

答案 0 :(得分:2)

如果没有要实现的特定方案的详细信息,这很难回答这样一个模糊的问题。

您可以通过多种方式返回Sharp Pages

  • 直接作为内容页面请求时,例如/dir/page-> /dir/page.html
  • 使用Page Based Routing,例如/dir/1-> /dir/_id.html
  • View Page作为对服务的响应,当它以请求DTO 响应DTO 的名字命名时,例如/contacts/1-> {{ 1}}或/Views/GetContact.html

通过在自定义/Views/GetContactResponse.html内返回Response DTO,选择要在服务内呈现的视图:

HttpResult

添加public object Any(MyRequest request) { ... return new HttpResult(response) { View = "CustomPage", // -> /Views/CustomPage.html //Template = "_custom-layout", }; } 请求过滤器属性,以在QueryString上修改视图和模板,例如:[ClientCanSwapTemplates]

?View=CustomPage&Template=_custom-layout

通过返回自定义的[ClientCanSwapTemplates] public object Any(MyRequest request) => ... ,选择要在Model View Controller Service内部呈现的页面:

PageResult
  

注意:public class CustomerServices : Service { public object Any(ViewCustomer request) => new PageResult(Request.GetPage("examples/customer")) { Model = TemplateQueryData.GetCustomer(request.Id) }; } 使用级联SharpPagesFeature解析页面。在.NET Core中,将其配置为使用其 WebRoot ,例如AppHost.VirtualFileSources

让Sharp Pages返回多种内容类型的响应:

  

也可以以多种格式返回原始模型。

您需要使用一个/wwwroot值的Sharp APIs,例如/hello/_name/index.html

return

答案 1 :(得分:1)

要简要回答我自己的问题,@ mythz的第一个选项是我需要的。在Plugins.Add(new SharpPagesFeature())中调用AppHost之后,我需要从服务方法中返回HttpResult

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