ServiceStack无控制器Razor视图 - 返回视图而不执行服务

时间:2017-06-02 17:01:56

标签: servicestack servicestack-razor

现在我们有很多虚拟MVC控制器,它们使用Web组件(vuejs)返回简单视图。我试图重构这个以确定我们是否可以使用无控制器剃刀插件,但是当浏览器请求路由时我不想执行实际的服务逻辑,因为组件已经这样做了。一个例子:

/account/edit/1是标准的MVC控制器 - &gt;与具有此<account edit="1" />之类的内容的视图相关联,该视图对/api/account/get/1进行ajax调用。我想添加Service Stack Razor引擎,以便我们可以使用:

/api/account/get/1(我们将删除api部分或添加备用路由)这不会执行逻辑但会执行安全属性,因此我们可以删除不使用的标准MVC控制器。我知道我们可以为此添加不同的服务以使其工作但我更喜欢使用相同的端点而不是执行它但返回剃刀。

有什么想法吗?

不是我想听到的答案,但基本上我们不能做我们想要的事情,而是我们创建一些虚拟服务堆栈服务来返回仍然消除控制器的正确视图。

1 个答案:

答案 0 :(得分:2)

为了使用ServiceStack.Razor's No Ceremony Option您可以在不需要ServiceStack服务的情况下返回动态Razor视图,您的路线需要与剃刀页面匹配,这样您就不会有如下路线:

/account/get/1

因为这需要Razor内容页面:

/account/get/1.cshtml

您可以将其添加到/account/get?id=1之类的queryString,然后您可以拥有一个Razor内容页面,如:

/account/get?id=1

如果你想处理/account/get/1,你需要一个处理该路线的服务,例如:

[Route("/account/get/{Id}", "GET")]
class ViewAccount 
{
    public int Id { get; set; }
}

您的服务可以返回相同的请求DTO,例如:

public object Get(ViewAccount request) => request;

这将是常规能够处理位于以下位置的Razor View:

/Views/ViewAccount.cshtml

使用模型:

@model ViewAccount

注意:通常不建议在路由中使用/get,这通常由HTTP GET请求区分,因此我建议删除get并且只是:

[Route("/account/{Id}", "GET")]

或者,如果您想为Razor视图使用单独的路径,则使用HTTP动词以外的其他内容可能会造成混淆,IMO view 更适合HTML页面,例如:

[Route("/account/view/{Id}", "GET")]