2012-06-05 27 views
0

好吧,這裏就是我試圖做...給這個剃鬚刀代碼mvc4的HtmlHelper擴展HTML的存儲模塊在同一個文件後輸出

@using(Html.WriteLater()) 
{ 
    output line one 
} 
actual first line 
@using(Html.WriteLater()) 
{ 
    output line two 
} 
actual second line 

@HTML.WriteNow(); 

我想這樣的輸出:

actual first line 
actual second line 
output line one 
output line two 

有時候,在視圖中將代碼塊邏輯地分組在一起很好,但最終的輸出需要以不同的方式組織。我試過ataching在幫助我的邏輯不同ViewContext,但它不工作:

public static WriteLaterContainer WriteLater(this HtmlHelper htmlHelper) 
{ 
    ViewContext vc = new ViewContext(); 
    return new WriteLaterContainer(vc); 
} 
+0

很明顯,我的WriteLater函數在這裏大大簡化了。我希望用它自己的textwriter創建一個新的viewcontext,並讓該textwriter捕獲函數調用後面的使用塊的內容......但這不起作用。 –

回答

3

不知道爲什麼你想重新發明輪子,而不是使用標準方法,如諧音,節幫手,..但我想你可能有一些原因。所以不完全是語法,你已經顯示,但是你可以通過使用2名助手的配合達到類似的效果:

public static class HtmlExtensions 
{ 
    private const string QueueKey = "_output_queue_"; 
    public static IHtmlString WriteLater(this HtmlHelper htmlHelper, Func<object, HelperResult> action) 
    { 
     var queue = htmlHelper.ViewContext.HttpContext.Items[QueueKey] as Queue<Func<object, HelperResult>>; 
     if (queue == null) 
     { 
      queue = new Queue<Func<object, HelperResult>>(); 
      htmlHelper.ViewContext.HttpContext.Items[QueueKey] = queue; 
     } 
     queue.Enqueue(action); 

     return MvcHtmlString.Empty; 
    } 

    public static IHtmlString WriteNow(this HtmlHelper htmlHelper) 
    { 
     var queue = htmlHelper.ViewContext.HttpContext.Items[QueueKey] as Queue<Func<object, HelperResult>>; 
     if (queue == null) 
     { 
      return MvcHtmlString.Empty; 
     } 

     var writer = htmlHelper.ViewContext.Writer; 
     foreach (var item in queue) 
     { 
      item(null).WriteTo(writer); 
     } 

     return MvcHtmlString.Empty; 
    } 
} 

,可以這樣使用:

@Html.WriteLater(@<div>output line one</div>) 
<div>actual first line</div> 
@Html.WriteLater(@<div>output line two</div>) 
<div>actual second line</div> 
@Html.WriteNow() 

和輸出將被預期一:

actual first line 
actual second line 
output line one 
output line two