【问题标题】:ServiceStack Controllerless Razor Views - Return view without executing serviceServiceStack 无控制器 Razor 视图 - 返回视图而不执行服务
【发布时间】:2017-06-02 17:01:55
【问题描述】:

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

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

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

有什么想法吗?

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

【问题讨论】:

    标签: servicestack servicestack-razor


    【解决方案1】:

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

    /account/get/1
    

    因为这需要 Razor 内容页面:

    /account/get/1.cshtml
    

    您可以改为将其添加到查询字符串中,例如 /account/get?id=1,这样您就可以拥有一个 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 视图:

    /Views/ViewAccount.cshtml
    

    与模型:

    @model ViewAccount
    

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

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

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

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

    【讨论】:

    • 我不确定这是否能回答我的问题。我只是以get为例。假设路由已设置并指向获取该 ID 帐户的正确服务。是否会在生成剃刀之前调用服务的逻辑?这是我试图避免的,因为我们所有的视图都有像迷你水疗应用这样的组件,它们会调用自己来获取数据。
    • @lucuma 如果他们指向一个服务,它总是在视图之前执行。 Razor 视图是服务响应的HTML Content Type representation,但“无仪式”选项允许您绕过要求服务并直接执行 Razor 页面,只要页面与路由匹配。还要确保你知道Content Pages vs View Pages 之间的区别
    • @lucuma 如果您正在构建一个 SPA,您通常不需要 HTML 视图,而只想通过 Ajax 访问 JSON 响应,如果您使用 JSON 客户端,ServiceStack 将自动返回 JSON 响应服务。
    • 这不是一个真正的水疗中心。我们只是将所有前端功能作为 vuejs 组件,就像角度指令一样。这使得所有 MVC 控制器都裸露,并增加了我试图摆脱的安全等重复工作。
    • @lucuma 安全/验证需要始终在后端实现,并且只能选择性地添加到客户端以改善用户体验。还可以在API First Development 上查看文档,因为它可以简化客户端上的验证,即使使用 ajax 请求也是如此。
    猜你喜欢
    • 2017-12-30
    • 2017-10-20
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多