ASP.NET MVC 4 / Web API - insert Razor renderer for Accepts: text/html

前端 未结 2 986
离开以前
离开以前 2021-02-15 17:40

I am creating a RESTful Web Service using ASP.NET MVC 4 Web API. For API access, I am returning JSON, though once I get everything working correctly, the content negotiation s

相关标签:
2条回答
  • 2021-02-15 17:59

    You might take a look at WebApiContrib.Formatting.Razor. It's very similar to Kyle's answer, however it's a full-blown open source project with more features, unit tests, etc. You can get it on NuGet as well.

    I will say it definitely needs more features, but they seem to have designed it well so it would be very easy to contribute to it.

    0 讨论(0)
  • 2021-02-15 18:06

    Fredrik Normén has a blog post on this very topic:

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

    Basically, you need to create a MediaTypeFormatter

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

    and then register it in Global.asax:

    GlobalConfiguration.Configuration.Formatters.Add(new RazorFormatter());
    

    the above code is copied from the blog post and is not my work

    0 讨论(0)
提交回复
热议问题