【问题标题】:Web API - Rendering Razor view by default?Web API - 默认情况下渲染 Razor 视图?
【发布时间】:2012-05-16 09:51:52
【问题描述】:

如何让 Web API 使用它返回的模型呈现 Razor 视图?并且只有在设置了接受标头(或 .extension)时才使用 XML/JSON?这甚至可能吗?

如果它们使用相同的模型,则需要一组控制器来呈现 HTML 和另一组用于 JSON/XML 似乎很疯狂。

更新 Darrel Miller 已经写了一个ViewEngineFormatter for Razor 可能会解决问题,虽然还没有尝试过。

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api


    【解决方案1】:

    我过去在 StackOverflow 上问过类似的问题,因为我想做同样的事情。然而,我最终得到了一个“Api”区域和一组控制器,以及一组用于网站的标准 MVC 控制器。

    事后看来,这实际上并不是一件坏事。我发现我倾向于在每组控制器中做不同的事情。我的视图不仅仅是 CRUD,而且往往包含额外的上下文数据,因此返回特定于该页面的视图模型很好。

    我认为,如果我坚持将两者结合起来的目标,我最终可能会得到过于复杂的控制器或无法达到最佳的用户体验。因此,虽然这不是您问题的直接答案,但根据我的经验,无法做到这一点可能不是一件坏事。

    相反,我最终得到了一组丰富的构建器和命令,我的大多数控制器都委派给这些构建器和命令。这样我就可以重用大部分控制器逻辑,同时能够针对 API 和 Web 做特定的事情:

    http://www.paulstovell.com/clean-aspnet-mvc-controllers

    【讨论】:

    • 很高兴知道你的结局——我实际上已经阅读了你关于干净控制器的帖子,所以谢谢你 :) 就上下文数据而言,它是共享视图数据吗?如果您使用 ActionFilter 路由来填充它,那是否会导致 API/前端再次具有相同的视图模型 - 或者您是否发现除此之外仍然存在差异?
    • 仍然存在差异,因为 UI 更侧重于任务,而 API 更侧重于 CRUD。
    【解决方案2】:

    是的,它就是这样设计的:用于数据的 Web API 和用于渲染视图的 MVC。 我知道有些人会尝试向 Web API 添加视图引擎支持,但它不是为它。

    我个人对此的看法是,MVC 和 Web API 之间的这种平行世界(这是大多数批评的来源,而社区普遍称赞该产品)主要是由于 Web API 已添加到 MVC 中,但没有参考(或相关知识)。

    正如 Jon Galloway 在最近的播客中所说,如果团队拥有他们现在所拥有的 HTTP 知识(以及他们当时没有的 REST API 现在的流行程度的事后观察),他们会设计一个单一的管道服务数据和渲染视图相似。

    我只能推测 未来 版本的 MVC/Web API 将呈现为一个单一管道。事实上,这个平行世界可能是在不久的将来统一他们的精心计划。

    【讨论】:

      【解决方案3】:

      需要一组控制器来呈现 HTML 似乎很疯狂 如果他们使用相同的模型,另一个用于 JSON/XML。

      AFAIK,就是这样。标准控制器应该用于呈现 HTML 和 JSON/XML 的 ApiControllers。

      【讨论】:

      • @ShaneCourtrille 那么他们在想什么叫它 ApiController 呢? ;) 但是同意,我的主要挫败感仅仅是因为 MVC 和 Web API 之间缺乏连接性
      【解决方案4】:

      需要一组控制器来呈现 HTML 似乎很疯狂 如果他们使用相同的模型,另一个用于 JSON/XML。

      Web API 正是它所称的 - 一种用于创建 API 的技术。

      如果您正在创建 ASP.NET MVC 应用程序并希望返回一些 JSON 用于您自己的目的,那么您不需要内容协商等。因此您不需要 Web API(只需使用普通的旧 JsonResult)。

      如果您想创建一个可重用的 API,那么您需要的是 Web API,但您的客户端应用程序应该以与其他人相同的方式使用它。

      Web API 并不是用来“钉”所有非 HTML 请求的“锤子”——在需要时使用它。

      【讨论】:

      • 恕我直言,公共 API 不一定与 MVC 应用程序不同——但 MVC 本身并不能很好地呈现不同的媒体类型。你不能两全其美(FubuMVC 和其他人除外),这似乎是一种耻辱。
      • 您还应该记住,ASP.NET MVC 在这里只是一个示例,因为 Web API 可以是自托管的,也可以是 WebForms 应用程序的一部分。最后,没有什么能阻止您创建支持这种情况的媒体类型格式化程序 - 这不是最好的设计。
      • 事实上有人已经有了 - github.com/WebApiContrib/WebAPIContrib/blob/master/src/… - 虽然你会好奇为什么你认为这条路线不是最好的设计?谢谢
      • Paul 已经强调了最常见的方面。实际的视图往往有很多额外的数据——这就是为什么 ViewModel 如此常见的模式。 Web API 旨在更直接地绑定到实际模型,这使其成为底层 CRUD 的理想解决方案,但不适用于整个表示层。这并没有改变这样一个事实,即更好地集成 ASP.NET MVC 和 Web API 的管道会带来一些技术优势(仍然逻辑分离是有意义的)。
      • WebApi 应该是 MVC 的超集。支持内容协商的 http api 框架没有理由不支持 text/html,它是万维网中最常见的媒体类型之一。需要 2 个单独的控制器(以及 2 个单独的 URL、路由、基础设施、模式等)来呈现同一资源的 JSON 和 html 表示形式是荒谬的
      【解决方案5】:

      我正在寻找类似的东西,但不完全是。通过搜索网络,我找到了 Fredrik Normen 的几篇文章。他写了这个确切的问题空间,并在列出的第二篇文章中实际确定了第三方解决方案。基本上,该解决方案涉及创建一个自定义 MediaTypeFormatter,它知道如何使用 Microsoft 提供的 Razor 引擎 (through the use of a third-party library) 处理视图。

      希望微软很快会在 Web API 中实现一些东西,因为超媒体似乎越来越受欢迎。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-08
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-29
        相关资源
        最近更新 更多