2009-08-26 4 views
0

Railsには、単一のアクションメソッドが適切な形式のデータ(json、xml、データだけ)を簡単に返すようにするための便利なイディオムがあります。クライアントが指定した(または他の要求から推定。それは次のようになります...ASP.NET MVCで複数の形式を返す処理に最適な方法は何ですか

respond_to do |format| 
    format.html #edit.html.erb 
    format.json {render :text=> <your json here>), :layout=> false} 
    format.xml ... 

end 

フォーマットは、ASP.NET MVCでこれを行うための好ましい方法は何ですか?理想的には、私がしたいですフレームワークはRailsと同じように動作します(例えば、クライアントが指定したフォーマットのために適切にフォーマットされたViewDataを返すことができる、あるいは要求自体から推測されたViewDataを返すことができる)。

Railsでは、各タイプに固有のビューを作成して、基本的にすべてのビューに同じデータを返すことができ、データのフォーマットを正しく処理できるようになります(xmlを構築するビュー、jsonを構築するビュー、別のものはhtmlを構築します)。これはASP.NET MVCで可能ですか?実際には、このモデルは、コントローラーがビューに依存しないデータを返すことを可能にするため、imhoの関心を分離するという目標を維持するのが最善のようです(上記の "format.json ....:layout => false ")コントローラ内でJSON変換を行い、その形式の要求があればそのデータをクライアントに直接返します。

どうにかして...提案、考え、推奨? ASP.NET MVCで

答えて

2

おかげで、コントローラのアクションは、一般的に、応答ストリームを生成しながらランタイムによって呼び出されActionResultから派生オブジェクトを返します。

あなたが ActionResultから派生するいくつかのクラス持ってすぐに使える

- ようにリダイレクトする、とのためにJSON、RedirectResultにオブジェクト階層をシリアル化するためのテキスト結果をContentResult、ビューからのコンテンツのViewResultJsonResultを。

一般にモデルを結果に渡して結果の生成方法を決定させますが、同じモデルである必要はありません。必要に応じて別のオブジェクトを各結果に渡すことができます。

アクションによって返される結果の具体的な種類は、アクションの署名に「焼き」ではありません - 簡単にあなたの行動にフォーマットパラメータを渡し、そしてそれに応じて異なるのActionResultを生成して返すことができます:

方法 Json()View()JsonResultViewResultのrespecを戻すための便利な方法をコントローラに内蔵されていることを

public ActionResult ListProducts(string format) 
{ 
    List<Product> products = ProductService.GetAllProducts(); 
    if (format == "JSON") 
    { 
     // eg., transform model for JSON consumption 
     List<JsonProduct> jsonProducts = ProductService.ToJSON(products); 
     return Json(jsonProducts); 
    } 
    else if (format == "XML") 
    { 
     return new XmlResult(products); 
    }

// default is to return HTML from view, which expects List<Product> for model 
    return View(products); 

}

注一気にXmlResultは、オブジェクトを取得してXMLにシリアル化し、その結果をXMLストリームとして返すカスタムActionResultの例です。

この例は少し工夫されていますが、コントローラが結果を選択し、その結果に渡されるモデルを構築/変換するすべての作業を調整することを示しています。コントローラのアクションはまだ軽量であるべきですが、ビジネスレイヤからモデルをロードするなど、重いタスクをサービスにオフロードしたり、あるモデルのオブジェクトを別のモデルのオブジェクト(JSONの消費など)に変換するなどです。

+0

ここで唯一の問題は、Json(あなたのモデル)を返すことはめったにありません。通常、私は人々がJson(またはXML)を特定の方法で構造化することを要求するクライアントでJQueryやExtJsのようなものを使用することを期待しています。 ...そのリストラはどこで起こりますか? コントローラーでそれを行う必要がある場合は... /どのように?また、私たちがそこにいたら...「懸念の分離」に違反していないのでしょうか? ビューで行う場合は、フレームワークを変更して、要求されたフォーマットに基づいて正しいビューを選択する方法を教えてください。 ありがとうございます。 – wgpubs

+0

私は同意します。ほとんどの場合、JSONを操作するための別のモデルが必要です。コントローラの関心事は、ビューにモデルを提供することです。ビューには、そのモデルが何であるべきかを決めること、そしてそのモデルにどのビューを与えるべきかが含まれます。コントローラーがそれを行うことはまったく関連しています。ビューがコントローラーの仕事をしていたならば、間違いなく違反になるでしょう。モデル構築を示すためにサンプルを編集しました。 – Sam

+0

そうですね、コントローラはデータがどのようにパッケージ化されてビューに送られたのか責任を負うべきだからですが、それは責任を負うべきです。使用されている1つまたは複数のクライアント側フレームワーク(ExtJs、Jquery、Mootoolsなど)に基づいて、潜在的に多くの形式のデータ ここでデータの束を返すだけではありません... JQueryまたはFOR ExtJのデータを返しています。これは、分離物が少しばかり不明瞭になり、ユニット・テスト・コントローラーも少し毛深くなります。 – wgpubs

関連する問題