2017-01-22 2 views
0

MVCコントローラを別のクラスの小さな部品にリファクタリングしています。私は "return StatusCode(500、" Someメッセージ ")"項目。MVCコントローラの外でStatusCodeオブジェクトを返す方法

コントローラーの外でこれを行うことができないかのように思えます。

これは可能ですか、または応答を返す別の方法を見つけて、呼び出しコード(MVCコントローラ)の適切な型に戻しますか?

MVCアクションの元のタイプはIActionResultなので、私は適切なレスポンスを返してきました。時にはview(、model)、時にはJson()と他の時StatusCode(< 500>)、すなわち私の応答は一貫していません。

このコードをピックアップして別のクラスに移動して正常に動作させるための自然な方法がありますか、そうでなければコントローラで返されたものを表現するために独自のオブジェクトを作成する必要があります。だから、何がお勧めですか?要するに

、理想的に私は、コントローラの外部のクラスでは、このような「ビューを返します(」私のビュー名」、mymodelという)として行動した結果を返すことができるようにしたい。 どのように私はこの?

を達成することができます

「StatusCode」、「Json」、および「View」の値を持つ、ステータスコード、メッセージ、オブジェクト(モデルとして機能する)、ビュー名、およびActionResultTypeという新しい列挙型を含む単一オブジェクトです。コントローラーが応答を受け取ったときに適切な自然状態に戻すことができます。

おそらく私は少し遠くに行くでしょうが、代わりにロジックの主要部分を取り出すことに集中すべきです他のどこかでより鮮明な応答を構築しようとするよりも、

可能であれば、私は各アクションの結果を約10行にしたいと思いますが、他の場所から適切な応答を返す良い方法を見つけ出すことができない限り、おそらく闘争になります。

+3

あなたのコントローラの外のロジックは、HTTPエラーコードを知らないで気にしないでください。 – DavidG

+0

これらはすべて基本型のActionResultを持っているので、問題の原因がわかりません。 –

+0

あなたは "InternalServerErrorを返す(新しい例外("いくつかのカスタムメッセージ "));" –

答えて

0

コントローラ間で共有コードが必要な場合は、共有コードを保持するようにベースコントローラを設定し、そのベースコントローラを他のコントローラに継承してアクセスする必要があります。

ActionResultには、必要なものすべてが保持されます。カスタムオブジェクトに必要なものはすべてActionResultのサブクラスとして存在します。 JsonResultはActionResultのサブクラスです。各エラーコードにはいくつかのサブクラスがあります。私はHttpNotFoundResultが別のものだと信じています。

私はあなたのコントローラの中でActionResult/Redirect/View/StatusCodeに関連するほとんどのものを保つことをお勧めします。それが典型的な場所です。

0

あなたがのためにそれらを置き換えることができます:

のStatusCodeヘルパーメソッドはとにかく何をするかだ
var result = new ObjectResult("Some message"); 
result.StatusCode = statusCode; 
return result; 

あなたがメッセージを必要としない場合は、あなただけ行うことができます。

return new StatusCodeResult(500); 

だけで、ファイルの先頭にusing Microsoft.AspNetCore.Mvc;を追加します。

関連する問題