ASP.NET MVC 4/Web API - 为接受插入Razor渲染器:text/html

Mik*_*sen 8 content-negotiation razor asp.net-mvc-4 asp.net-web-api

我正在使用ASP.NET MVC 4 Web API创建RESTful Web服务.对于API访问,我返回JSON,但是一旦我使一切正常工作,内容协商默认情况下应该适用于XML和JSON.

由于我正在努力建立一个真正的RESTful以资源为中心的Web服务,我的URI将指向实际的资源.我想通过返回Accepts: text/html请求中的资源的HTML表示来利用它(比如在浏览器中抛出链接).

我希望能够利用MVC 4 Web API的内容协商来为使用Razor模板的text/html插入渲染器.这样做有什么工作的例子吗?

是的,这是桥接"常规"MVC页面和Web API.基本上我想创建一个渲染器,它使用基于约定的方法来查找和渲染Razor视图,就像"常规"MVC一样.我可以提出基于约定的视图查找逻辑. 我只是在寻找 a)全局地将我的text/html渲染器插入到内容协商中,以及b)手动使用Razor引擎将我的模型渲染为HTML.

Kyl*_*man 3

Fredrik Norm\xc3\xa9n 有一篇关于这个主题的博客文章:

\n\n

http://weblogs.asp.net/fredriknormen/archive/2012/06/28/using-razor-together-with-asp-net-web-api.aspx

\n\n

基本上,您需要创建一个MediaTypeFormatter

\n\n
using System;\nusing System.Net.Http.Formatting;\n\nnamespace WebApiRazor.Models\n{\n    using System.IO;\n    using System.Net;\n    using System.Net.Http.Headers;\n    using System.Reflection;\n    using System.Threading.Tasks;\n\n    using RazorEngine;\n\n    public class RazorFormatter : MediaTypeFormatter\n    {\n        public RazorFormatter()\n        {\n            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); \n            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xhtml+xml"));\n        }\n\n        //...\n\n        public override Task WriteToStreamAsync(\n                                                Type type,\n                                                object value,\n                                                Stream stream,\n                                                HttpContentHeaders contentHeaders,\n                                                TransportContext transportContext)\n        {\n            var task = Task.Factory.StartNew(() =>\n                {\n                    var viewPath = // Get path to the view by the name of the type\n\n                    var template = File.ReadAllText(viewPath);\n\n                    Razor.Compile(template, type, type.Name);\n                    var razor = Razor.Run(type.Name, value);\n\n                    var buf = System.Text.Encoding.Default.GetBytes(razor);\n\n                    stream.Write(buf, 0, buf.Length);\n\n                    stream.Flush();\n                });\n\n            return task;\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在 Global.asax 中注册:

\n\n
GlobalConfiguration.Configuration.Formatters.Add(new RazorFormatter());\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码是从博客文章中复制的,不是我的作品

\n