使用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的视图选择,还可以支持不同的响应格式?
答案 0 :(得分:2)
如果没有要实现的特定方案的详细信息,这很难回答这样一个模糊的问题。
您可以通过多种方式返回Sharp Pages:
/dir/page
-> /dir/page.html
/dir/1
-> /dir/_id.html
/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",
};
}