2011-12-07 7 views
1

MVCアプリケーションの一部にwikiが含まれています。標準的なWikiフォーマットと同様に、データをテンプレートにレンダリングするためのいくつかの特別なタグがあります。これらのタグを解析すると、リポジトリからデータを取得し、ビューモデルをインスタンス化して部分的にレンダリングし、この部分を元のタグに置き換えてマークアップに挿入します。最終化されたマークアップ自体は、関連するUIHintを持つ任意のプロパティのDisplayForの一部としてレンダリングされます。部分のテキストを返す

コードの関連部分は次のとおりです。

private static void MatchSpecial(WikiHelper wh) 
    { 
     wh.match = SpecialTagRegex.Match(wh.sb.ToString()); 
     while (wh.match.Success) 
     { 
      wh.sb.Remove(wh.match.Index, wh.match.Length); 
      string[] args = wh.match.Groups[2].Value.Split('|'); 
      switch (wh.match.Groups[1].Value.ToUpperInvariant()) 
      { 
       case "IMAGE": 
        string imageid; 

        imageid = args[0]; 
        Image i = baserepo.imagerepo.GetImage(imageid); 
        ViewModels.ImageViewModel ivm = new ViewModels.ImageViewModel(i, args); 
        wh.sb.Insert(wh.match.Index, wh.Html.Partial("ImageViewModel",ivm)); 
        break; 
      } 
      wh.match = SpecialTagRegex.Match(wh.sb.ToString(), ws.end); 
     } 
    } 

WikiHelperの関連メンバーは以下のとおりです。MVC2で

wh.sb - StringBuilder containing the markup 
wh.html - the HtmlHelper from the main view 
wh.match - holds the current regex matches 

これがうまく働きました。私は現在、MVC3とRazor ViewEngineにアップグレードしています。 Html.Partialが部分のMvcHtmlStringを返すことになっているにもかかわらず、代わりに空の文字列を返し、HTMLファイルの最上部に表示されるすべて同様のテンプレート要素の結果を持つレスポンスに直接コンテンツを書き込んでいます(私のレイアウトファイルの中でさえも)。

+0

あなたはあなたの意見を投稿できますか? –

答えて

1

あなたが記述している症状を考えれば、あなたはカスタムヘルパーのどこかでレスポンスストリームに直接書き込んでいると思います。だから、あなたが応答にoutputingされているところはどこでもあなたが交換することを確認してください:

htmlHelper.ViewContext.HttpContext.Response.Write("some string"); 

で:

htmlHelper.ViewContext.Writer.Write("some string"); 

応答ストリームに直接書き込むWebフォームで働いていた、それはこのだった古典的なWebフォームからの遺産であるため、エンジンを表示物事はどのように働いていたのだろうか。 ASP.NET MVCでは、これは間違っています。それは働いたが間違っている。すべてのヘルパーはViewContext.Writerに書いてください。 Razorは物事をテンポラリバッファに書き込んだ後、一時的なバッファに書き込んで応答にフラッシュします。インサイドアウトレンダリングを使用します。

+0

うん、私は実際にdisplaytemplateでResponse.Writeを使用していた – Chao

関連する問題