6

.NET MVC 3にRESTレイヤーを実装しています。Acceptヘッダーを取得して、JsonとXmlのどちらを返す必要があるかを判断するためのクリーンな方法を探しています。

また、デバッグ用のGETパラメーターを使用してこのヘッダーをスプーフィングできるようにしたいと思います(これをprodにも保持したい)。

これが私が現在これを検出している方法です:

if (Request.AcceptTypes.Contains("application/json") || Request.Url.Query.Contains("application/json"))

これは、リクエストオブジェクトに直接触れるコントローラーコード内の唯一の場所です。私はこれを読むためのよりクリーンでよりテスト可能な方法を望んでいます。私の理想的な解決策は、コントローラーのパラメーターです。

デフォルトのモデルバインダーがそれを拾うかどうかを確認するためにいくつかのキーワードを試しましたが、試したものは何も機能しませんでした。

では、この情報を取得するための最もクリーンな方法は何ですか?カスタムモデルバインダー?例を挙げていただけますか?

4

2 に答える 2

2

アクション フィルター属性は、優れたクリーンなソリューションです。

ここに良いチュートリアルがあります: http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs

于 2012-07-30T23:23:26.963 に答える
2

カスタム モデル バインダーに代わるより良い方法はありません。他の誰かがこれを見た場合に備えて、バインダーの実装をここに投稿します。モデル バインダーを使用すると、Accept ヘッダーをアクションの直接入力に強くバインドできるため、戻り値の型を直接テストでき、人為的に必要以上のアクションを強制することも、動的に型指定されたビューデータにつながることもありません。 /バッグ。

サポートされている列挙型を持つモデル バインダーを次に示します。

public enum RequestAcceptType
{
    NotSpecified,
    Json,
    Xml
}

public class RequestAcceptTypeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }

        RequestAcceptType acceptType = RequestAcceptType.NotSpecified;

        // Try for Json
        if (controllerContext.HttpContext.Request.AcceptTypes.Contains("application/json") || controllerContext.HttpContext.Request.Url.Query.Contains("application/json"))
        {
            acceptType = RequestAcceptType.Json;
        }

        // Default to Xml
        if (acceptType == RequestAcceptType.NotSpecified)
        {
            acceptType = RequestAcceptType.Xml;
        }

        return acceptType;
    }
}

Application_Start メソッドの Global.asax の関連ビットを次に示します。

ModelBinders.Binders[typeof(RequestAcceptType)] = new RequestAcceptTypeModelBinder();

次に、アクションで使用するには、列挙型で引数 (任意の名前) を作成します。

public ActionResult Index(RequestAcceptType acceptType)

数日以内に誰もより良い方法で応答しない場合は、これを答えとして受け入れます.

于 2012-07-31T16:09:32.813 に答える