2017-01-30 1 views
1

最近、私はJSON.netコントラクトリゾルバを使用できるようにコントローラクラスのJsonメソッドをオーバーライドしようとしている間に奇妙なシナリオを発見しました。最後にContentResultのオブジェクトを返し、それをActionResultにアップキャストした場合、これは完全に機能します。しかし、私はJSONResultのオブジェクトを返そうとするとうまくいきません。オーバーライドされたJsonメソッドからJSONResultを返すことができず、ContentResultが機能するのはなぜですか?

protected new ContentResult Json(object data, JsonRequestBehavior behaviour = JsonRequestBehavior.DenyGet) 
    { 
     var jsonSerializerSettings = new JsonSerializerSettings 
     { 
      ContractResolver = new CamelCasePropertyNamesContractResolver() 
     }; 

     if (Request.RequestType == WebRequestMethods.Http.Get && behaviour == JsonRequestBehavior.DenyGet) 
     { 
      throw new InvalidOperationException("GET is not permitted for this request"); 
     } 

     var jsonResult = new ContentResult 
     { 
      Content = JsonConvert.SerializeObject(data, jsonSerializerSettings), 
      ContentType = "application/json", 
     }; 

     return jsonResult; 
    } 

説明はありますか?

+0

なぜですか?何が起こるのですか? – SLaks

答えて

1

オーバーライドされたJsonメソッドは、JsonResultを返す必要があります。

ContentResultは、両方ともActionResultクラスから継承されているため、これを実行できます。

いずれにしても機能したい場合は、オーバーライドからActionResultを返すことができます。しかし、もう1つの問題があります。このメソッドを使用するすべてのコントローラメソッドは、ActionResultも返す必要があります。

大きな問題ではないかもしれませんが、コードをきれいに保つには、ロジックをActionFilterAttributeとして実装し、グローバルに使用するにはFilterConfigに登録する必要があります。

+0

私はContentResultで動作する理由を理解していますが、なぜJsonResultを使用しているときに動作しないのか分かりません。私がJsonResultオブジェクトを返すとき、これは私が得るものです。 GET要求を許可するには、JsonRequestBehaviorをAllowGetに設定します。」というメッセージが表示されます。これは、AllowGetを指定せずにデフォルトのJsonメソッドを呼び出そうとするときに得られるものです。 –

+0

@HemAcharyaだから何をしたいですか?常にallowGet? –

+0

私は常にallowGetを望んでいません。しかし、JSONResultオブジェクトをオーバーライドされたメソッドから返すときに、明示的にJsonRequestBehaviour.AllowGetを渡しても、私は上記のエラーを受け取ります。 –

0

戻り値の型としてJsonResultを使用している間にJsonRequestBehavior.AllowGetを使用していますか?

+0

はい。私はJsonRequestBehavior.AllowGetを使用します。しかし、JSON結果のオブジェクトをオーバーロードされたメソッドから返す場合でも、AllowGetを渡さずにJsonメソッド(オーバーロードなし)を通常呼び出すと、基本的に同じエラーがスローされます。 –

関連する問題