2012-01-23 16 views
2

私はここでベストプラクティスタイプの答えを探しています。基本的に私は非常に頻繁にデータのビットをクライアントに返す非常に混雑したアプリケーションを持っています。最終的に返されるデータのビットは最終的にhtmlがDOMに動的に追加されることになります。 、ASP.NET MVCでhtmlスニペットを維持して、ajaxで返す最善の方法

  1. リターンだけでJSONデータをjQueryと多分jqueryのテンプレート
  2. リターンサーバー上に構築され、実際のHTMLを使用してクライアント側でHTMLを作成しますので、私は、次の2つの方法のどちらかを選択しようとしています側

私は最も簡単に選択できるようにしたいと思います。つまり、私はHTMLスニペットを非常に頻繁に更新できる最良の方法を望んでいます。

私は実際にASP MVCの部分的なビューを使用して#2を行う方法を探していて、文字列の書式設定を使用する必要があります。基本的に私はこのような呼び出しを行うために探しています:

string sHtml = string.Format(GetNewTradeHtml(), "GOOG", "100", "635.50"); 

と私はGetNewTradeHtml()が実際にASP MVCのビューの代わりのように見えるかもしれません文字列定数からHTMLを取得したい:

const string cNewTradeHtml = "<li><span>Symbol: {0}</span><span>Qty: {1}</span><span>Price: {2}</span></li>"; 

文字列定数基本的に私は私がToStringメソッドを呼び出すことができますビューいくつかのビューテンプレートを管理する方法を探していると思う

...これらの事の種類と私はそれらを維持嫌いを行うための一般的な方法のようです()をオンにして生のHTMLを取得し、文字列の書式設定を使用します。私は、ASP MVC(ネーム・ハッキングなし)で、私の特定の問題をネイティブに解決する方法を提案したいと考えています。おそらく、(残念ながら)文字列定数+ String.Formatのは、サーバー側のダイナミックHTMLを維持するための最良の方法ですが...

UPDATE:

は、ここで私はこの質問を掲載しましたので、私が学んだことです

ビューを文字列にレンダリングする方法については、ここにたくさんの投稿があります。さまざまな方法がありますが、MVCのバージョンが異なる場合もあります。いくつかは他のものよりもきれいであり、いくつかはかなり重いものです...すべては通常、コントローラのコンテキストを必要とする何らかのタイプのソリューションです。ほとんどの場合、ソリューションは要求に対する応答として大きく機能します。私の場合、私はコントローラのコンテキストの外でそれを行う必要があるので、私はコントローラを模擬するか、偽造オブジェクトの束を作る必要があります。どちらも本当に対処したくありません。

私は実際には、レスポンスにコントローラを使用せずに、ひげそり部分を文字列表現にレンダリングする簡単な方法がないと判断しました。コントローラのコンテキストや要求オブジェクトを模擬しなくても、これを簡単に行う必要があります。

+0

、変更する必要があり、さらに苦もなく、それがコントローラにフック拡張メソッドですあなたのタグasp ASP.NET MVCはasp-classicとは何の関係もありません – webb

+0

thx - それを修正しました。どういうわけか偶然にそれをしました。 – ijjo

+0

ただの観測。 'epic'、 'timestamp'、 'tradeprice'(これらのフィールドを想定しています)を含むビューモデルを作成し、この強く型付けされたモデルをpartialviewに取り込むことは賢明ではありませんか?基本的には、partialviewをajaxの成功関数に直接渡して実行することができます。 –

答えて

2

asp.net mvcのビューは何ですか?彼らはただのHTMLテンプレートです。彼らはモデルを取り、テンプレートプレースホルダーをモデル値で置き換えます。実際、Viewsを使用するよりも、asp.net mvcでhtmlをレンダリングする自然な方法はありません。

まず、お使いのコントローラのアクション

public ViewResult GetNewTrade() 
{ 
    NewTradeViewModel model = new NewTradeViewModel; 
    model.Symbol = "GOOG"; 
    model.Quantity = "100"; 
    model.Price = 635.50m; 

    // PartialView, as you want just html snippets, not full layouts with master pages, etc 
    return PartialView("TemplateViewName", model); 
} 

とごく普通の観点より

public class NewTradeViewModel 
{ 
    public string Symbol { get; set; } 
    public decimal Quantity { get; set; } 
    public decimal Price { get; set; } 
} 

あなたのビューモデルを宣言 - あなたはこれらの任意の数を有していてもよく、単に特定のものを返すために、コントローラのアクションを変更します

@model NewTradeViewModel 

<li><span>Symbol: @Model.Symbol</span><span>Qty: @Model.Quantity</span><span>Price: @Model.Price</span></li> 
+1

archil - +1、私は私のコメントで提案された、まあ、私はそのようにactionresultを返すだろう:return PartialView( "_ TemplateViewName"、モデル); :) –

+0

@jim部分的なビューについての良い点、私は私の答えを更新します – archil

+0

ok - 私はビューにモデルを渡したい場合は、文字列として生のHTMLを取得するか?私はこれをwebsocket経由で返すことができ、単にajax呼び出しではありません。私は私の元の質問のwebsocketsを言及しなかった。おそらく私は持っているはずです。 – ijjo

0

あなたのアプリは "チャット"テンプレートエンジンを使用してJsonを返し、クライアント側でレンダリングすることを検討してください。

あなたのスニペットがかなり小さいように見えるので、これは本当にトスです。あなたが前後に送るJSONで行く場合

、私はjquery templatesまたは

backbone.jsmustacheはまた、あなたがより良いあなたのクライアント側のコンポーネントを整理することができますお勧めすることができます。起床してそれを実行するのはかなり簡単です。デフォルトではjqueryテンプレートで動作しますが、必要に応じて他のテンプレートをプラグインすることもできます。ここで

は、別々のファイルにもう一度あなたの質問を見て、あなたが文字列としてのhtml partialviewを返すに言及されていることがわかり http://encosia.com/using-external-templates-with-jquery-templates/

+0

ええ、私はクライアント側でそれをやっていると考えて...私もjqueryテンプレートを使用して検討しているが、私は簡単に維持されているより良いソリューションが欲しい。 backbone.jsは面白そうです。私はそれを見るかもしれない。 – ijjo

+0

別のファイルにテンプレートを格納することを含む私の答えを更新しました – Dan

+0

私はこの解決策が好きですが、以下に述べるように、私のアプリはクライアントサイドの処理が非常に重いため、私はクライアントサイドのHTMLが必要な場合、これは素晴らしいソリューションのように見えます。ありがとう! – ijjo

0

ijjo、

をテンプレートを保存する簡単な方法です。このタイプの関数にはここに多くの参考文献がありますが、以下はまだ生産中の「古い」mvcアプリケーションから取得した私のバージョンです。 (上記archilの例のように)

public static class ExtensionMethods 
{ 
    public static string RenderPartialToString(this ControllerBase controller, string partialName, object model) 
    { 
     var vd = new ViewDataDictionary(controller.ViewData); 
     var vp = new ViewPage 
     { 
      ViewData = vd, 
      ViewContext = new ViewContext(), 
      Url = new UrlHelper(controller.ControllerContext.RequestContext) 
     }; 

     ViewEngineResult result = ViewEngines 
            .Engines 
            .FindPartialView(controller.ControllerContext, partialName); 

     if (result.View == null) 
     { 
      throw new InvalidOperationException(
      string.Format("The partial view '{0}' could not be found", partialName)); 
     } 
     var partialPath = ((WebFormView)result.View).ViewPath; 

     vp.ViewData.Model = model; 

     Control control = vp.LoadControl(partialPath); 
     vp.Controls.Add(control); 

     var sb = new StringBuilder(); 

     using (var sw = new StringWriter(sb)) 
     { 
      using (var tw = new HtmlTextWriter(sw)) 
      { 
       vp.RenderControl(tw); 
      } 
     } 
     return sb.ToString(); 
    } 
} 

用法:

public ViewResult GetNewTrade() 
{ 
    NewTradeViewModel model = new NewTradeViewModel; 
    model.Symbol = "GOOG"; 
    model.Quantity = "100"; 
    model.Price = 635.50m; 

    // PartialView, as you want just html snippets, not full layouts with master pages, etc 
    return this.RenderPartialToString("TemplateViewName", model); 
} 

幸運と楽しむ...

+0

私はサーバー側でこれらのスニペットを維持したいので、私はこのソリューションの外観が好きです。それを信じるかどうか、私のアプリケーションは実際にはスーパークライアント側に重いですし、サーバーは実際にほとんど何もしていません。だから私はクライアント側でレンダリングするのではなく、htmlを扱うサーバーに固執しようとします(上記の提案は良いようですが)。これを撃つ! – ijjo

+0

ijjoはあなたの時間を奪い、あなたに最高のショットを与えます:)。それがすべてどのように機能するかを知っている。 –

+0

実際には、コントローラのコンテキスト外でこれを行う必要があります。これは可能ですか?または私はコントローラのコンテキストでコントローラをインスタンス化する必要があると思いますか?周りを見て、それは何か簡単な何かをする仕事のように思える..任意の考えですか? – ijjo

関連する問題