1

ユーザーからのhtmlリクエストに基づいてRazorビューを自動的に生成するHTML用のメディアタイプフォーマッターを作成しています。SelfHostedサービス内で使用するためにこれを行っています。レンダリングするビューを選択できるようにするために、どのコントローラー/アクションが要求されたかを検出する必要があります。

 public class RazorHtmlMediaTypeFormatter : MediaTypeFormatter
    {
        public RazorHtmlMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        }

        public override bool CanWriteType(Type type)
        {
            return true;
        }

        public override bool CanReadType(Type type)
        {
            return false;
        }

        public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, System.Net.TransportContext transportContext)
        {
            return Task.Factory.StartNew(() =>
                {
                    var view = Razor.Resolve(String.Format("{0}.{1}.cshtml", something.Controller, something.Action), value);

                    byte[] buf = System.Text.Encoding.Default.GetBytes(view.Run(new ExecuteContext()));
                    stream.Write(buf, 0, buf.Length);
                    stream.Flush();
                });
        }
    }
4

2 に答える 2

6

返されたオブジェクトを でラップしてみませんMetadata<T>か?

MyCustomObjectつまり、の代わりに、を返しMetadata<MyCustomObject>ます。Metadata プロパティとして、コントローラー名とアクションを設定できます。次に、フォーマッタで、メタデータとカスタム オブジェクトを分離し、そのカスタム オブジェクトだけをシリアル化します。

このアプローチについては、 http: //www.strathweb.com/2012/06/extending-your-asp-net-web-api-responses-with-useful-metadata/ のブログに投稿しました。この記事の目的は少し異なりますが、あなたのニーズに関連付けることができると確信しています.

編集: または、小さなハックで問題ない場合は、カスタム フィルターとヘッダーを使用します。

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Response.Headers.Add("controller", actionContext.ActionDescriptor.ControllerDescriptor.ControllerName);
        actionContext.Response.Headers.Add("action", actionContext.ActionDescriptor.ActionName;);
        base.OnActionExecuting(actionContext);
    }

次に、フォーマッタのヘッダーからそれを読み取り、クライアントに送信されないようにヘッダー エントリを削除します。

于 2012-06-12T07:02:38.200 に答える
1

Web API Contrib には、ここで動作する RazorViewFormatter があります。

于 2012-06-12T10:09:09.173 に答える