8

ASP.NET MVC 4WebAPIを使用してRESTfulWebサービスを作成しています。APIアクセスの場合、JSONを返しますが、すべてが正しく機能するようになると、コンテンツネゴシエーションはデフォルトでXMLとJSONに対して機能するはずです。

私は真にRESTfulなリソース中心のWebサービスに取り組んでいるので、私のURIは実際のリソースを指します。Accepts: text/htmlリクエストに含まれる場合(ブラウザにリンクをスローするなど)、リソースのHTML表現を返すことで、これを利用したいと思います。

MVC 4 Web APIのコンテンツネゴシエーションを利用して、Razorテンプレートを使用するtext/htmlのレンダラーを挿入できるようにしたいと思います。これを実行する実例はありますか?

はい、これは「通常の」MVCページとWebAPIの橋渡しです。基本的に、「通常の」MVCのようにRazorビューを検索してレンダリングするために、規則ベースのアプローチを使用するレンダラーを作成したいと思います。規則ベースのビュールックアップロジックを思い付くことができます。 私は単に、 a)text/htmlレンダラーをコンテンツネゴシエーションにグローバルに挿入し、 b) Razorエンジンを手動で使用してモデルをHTMLにレンダリングすることを探しています。

4

2 に答える 2

3

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, 0, buf.Length);

                    stream.Flush();
                });

            return task;
        }
    }
}

次に、Global.asaxに登録します。

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

上記のコードはブログ投稿からコピーされたものであり、私の仕事ではありません

于 2012-08-02T18:46:20.960 に答える
0

WebApiContrib.Formatting.Razorをご覧ください。これはカイルの答えと非常に似ていますが、より多くの機能や単体テストなどを備えた本格的なオープンソースプロジェクトです。NuGetでも入手できます。

間違いなくもっと多くの機能が必要だと思いますが、彼らはそれをうまく設計しているように見えるので、それに貢献するのは非常に簡単です。

于 2014-01-30T23:21:27.653 に答える