ASP.NET MVC 4 / Web API – 为Accepts插入Razor渲染器:text / html

前端之家收集整理的这篇文章主要介绍了ASP.NET MVC 4 / Web API – 为Accepts插入Razor渲染器:text / html前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用ASP.NET MVC 4 Web API创建RESTful Web服务.对于API访问,我正在返回 JSON,但是一旦我使一切正常工作,内容协商默认情况下应该适用于XML和JSON.

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

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

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

解决方法

FredrikNormén有一篇关于这个主题博客文章

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

基本上,您需要创建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,buf.Length);

                    stream.Flush();
                });

            return task;
        }
    }
}

然后在Global.asax中注册它:

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

上面的代码是从博客文章复制而来的,不是我的工作

猜你在找的asp.Net相关文章