2012-01-27 5 views
2

おはよう!コントローラ/アクションでJsonValueProviderを使用する方法

JsonValueProviderが組み込まれているASP.NET MVC 3を使用しています。

問題があるのは、Content-Type: application/jsonが指定されている場合のみです。

JSONだけがサポートされている形式のAPIを構築しています。クライアントにこのヘッダーを強制的に設定させたくありません。

コントローラ/アクションに特定のValueProviderを使用させる方法はありますか?

+1

私はこれが本当の答えではないことを知っていますが、誰かが言うように、「ああ、私はXMLで結果を得ることができますか?他のフォーマットに柔軟性を持たせ、オープンにする価値があります。 – Magrangs

+0

私は実際に(少なくともそうする可能性がある)最も幅広いフォーマットをサポートしたいと思っていますが、コンテンツタイプのヘッダーは私の消費者の70%が設定するのに問題になることがありますAPI。 – artvolk

+0

私はあなたが何を意味するかを見て、それは非常に迷惑でなければならない!あなたはコンテンツタイプのヘッダーを設定できない場合は、APIを使用して何を行っているのですか? ;-) – Magrangs

答えて

2

これは機能しますが、非常に簡単ですが、それはより多くのハックのようです。できることは、AuthorizeAttributeから派生した属性を作成し、OnAuthorizationでContent-Typeをapplication/jsonに設定することです。

public class JsonActionAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     filterContext.HttpContext.Request.ContentType = "application/json"; 
    } 
} 

[JsonAction] 
public ActionResult JsonOnlyAction(string var1, int var2, ...) 
{ 
    ... 
} 

この属性は、コントローラレベルでも適用できます。

もともと私はアクションフィルタでのContent-Typeを設定しようとしたが、問題がOnActionExecutingでは後の値プロバイダがそのように遅すぎるがあり、コンテンツタイプを設定し、選択されて起こります。

OnAuthorization前の値プロバイダーが選択されて発生し、Request.ContentType.StartsWith("application/json")このためJsonValueProviderFactoryチェックするので、それが選択されていることを確認します。

+0

素敵なハックです、誰かがもっとフレームワーク指向のアプローチを思い付かないなら、答えとしてマークします。 – artvolk

0

私は質問を誤解していますが、これはあなたが何をする必要があるかない場合はごめんなさい:

Response.ContentType = "application/json" 

あなたが複数のアクションで、この行の繰り返しを避けるためにアクションフィルタ/属性を作成することができます。

+0

いいえ、着信要求に関する質問 - 私はJSONエンコードされた要求を解釈するようにASP.NETを強制したいと思います。 – artvolk

関連する問題