我创建使用ASP.NET MVC 4的Web API RESTful Web服务。 对于API的访问,我返回JSON,但一旦我得到的一切工作正常,在内容协商应XML和JSON默认工作。
由于我对一个真正的RESTful资源为中心的Web服务的工作,我的URI将指向实际资源。 我想通过返回的资源的HTML表示,如果要利用该Accepts: text/html
进来请求(如扔在浏览器中的链接)。
我希望能够利用MVC 4的Web API的内容协商来插入text / html的使用剃刀模板的渲染器。 是否有这样做只是这一点任何工作的例子吗?
是的,这是弥合“常规”页面MVC和Web API。 基本上我想创建一个使用惯例为基础的方法来寻找和呈现剃刀意见就像“常规” MVC渲染。 我可以拿出以公约为基础视图查找逻辑。 我只是在寻找 一个)全球插入我的text/html
渲染到内容negotation,和b)用剃刀引擎手动渲染我的模型转换成HTML。
弗雷德里克·诺门对这个题目博客文章:
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, 0, buf.Length);
stream.Flush();
});
return task;
}
}
}
然后在Global.asax中注册它:
GlobalConfiguration.Configuration.Formatters.Add(new RazorFormatter());
上面的代码是从博客文章复制,而不是我的工作
你可能会看一看WebApiContrib.Formatting.Razor 。 这是非常相似,凯尔的答案,但是它有更多的功能,单元测试等,一个成熟的开源项目,你可以得到它的NuGet为好。
我会说,这肯定需要更多的功能,但他们似乎都设计得很好,因此会很容易做出贡献。