2013-05-06 51 views
1

我目前有一個場景,我重新使用HTML代碼塊。我基本上有一個div容器,我在整個站點重新使用該容器及其變體。需要一個替代我的IDisposable文012

的包裝容器由以下的html:

<div class="c_wrapper"> 
    <div class="c_content"> 
     CONTENT GOES HERE 
    </div> 
</div> 

* 請注意,有很多更重要的集裝箱比我指定,這是一個基本的框架。

而不是重新鍵入上多次我容器代碼每一頁上,我利用了IDisposable,使其稍微容易一些:

public static class Container 
{ 
    public static ContainerHelper BeginContainer(this HtmlHelper content, int containerSize) 
    { 
     return new ContainerHelper(content, containerSize); 
    } 
} 

public class ContainerHelper : IDisposable 
{ 
    private readonly HtmlHelper _content; 
    public ContainerHelper(HtmlHelper content, int containerSize) 
    { 
     _content = content; 
     var sb = new StringBuilder(); 
     sb.Append("<div class=\"container_" + containerSize + "\">"); 
     _content.ViewContext.Writer.WriteLine(sb.ToString()); 
    } 

    public void Dispose() 
    { 
     var sb = new StringBuilder(); 
     sb.Append("</div>"); 
     _content.ViewContext.Writer.WriteLine(sb.ToString()); 
    } 
} 

這意味着我現在可以簡單地使用以下每當我想使用的容器:

@using (Html.BeginContainer(24)) 
{ 
    <span>hello world... and other content here</span> 
} 

我想,雖然藉此遠一點,我意識到,IDisposable的不是理想的解決方案。

我希望能夠做到以下幾點:

@Html.Container(24) 
{ 
    <span>hello world... and other content here</span> 
} 

我如何能做到這一點有什麼建議?如果這是不可實現的,關於如何在不使用IDisposable的情況下完成我的第一個示例的建議。

我正在使用MVC 3/4和C#。

Thanx

+0

也許我誤解了......但爲什麼你不能只調用一個函數返回一個'IHtmlString'?你的例子是不可能的..但也許我的建議適合?順便說一句,這不是一個黑客。我一直在某些地方使用它。事實上,我已經看到很多擴展HtmlHelpers的例子,完全相同的方式。 – 2013-05-06 11:30:02

+0

我寫出html,所以我放在我使用的括號中的東西獲取與div包裹。你能舉一個我如何完成與IHtmlString相同的例子嗎? – 2013-05-06 11:30:57

+1

我的觀點是,你無法像使用''一樣對待它。沒有上下文中的大括號說「好吧,我完成了,處置我和調用這個代碼」就像是一個「使用」塊。 「使用」就是這樣工作的,因爲它變成了「試圖......最後」的「幕後」。 – 2013-05-06 11:32:39

回答

2

有你的幫手方法接受委託。菲爾哈克在detail

public static HelperResult Container(int containerSize, Func<dynamic, HelperResult> template) 
{ 
    return new HelperResult(writer => template(null).WriteTo(writer)); 
} 


@Html.Container(24, @<span>hello world... and other content here</span>) 

這將只輸出你在通過blgoged這個問題。當您div標籤包裝它,在HelperResult

之所以打電話給writer參數爲Func<dynamic, HelperResult>是傳遞給該方法的標記始終作爲一個委託使用單個參數傳遞並返回HelperResult。在這種情況下,由於您沒有傳入任何數據,因此我使用dynamic來簡化它,但是如果您閱讀上面的鏈接,則會看到您可以傳入任何類型的對象,並且可以通過特殊變量item

+0

這讓我進入了一個全新的探索領域...... thanx。 – 2013-05-06 12:29:27

+0

這也是我的建議。大多數人都不知道的非常酷的MVC片斷。 – rossisdead 2013-05-06 15:08:53

+0

這有助於很多,我把它標記爲正確的答案,只需注意嵌套這些模板是一場噩夢。 – 2013-05-08 11:48:09

0

這很聰明。但是,這種編碼可能會在最後給你帶來一些麻煩。假設一個同事試圖在不知道它如何工作的情況下使用你的類(它如何關閉div)。另外假設有一天你會忘記你在那裏做了什麼,並且你嘗試在using塊之外使用它。

我的建議:不要在Dispose方法中做任何與真正處置無關的邏輯。這只是一種方法,只能做它應該做的事情。相反,有一個靜態方法,它可以在你的div內使用任何你想要的東西。這個方法必須包裝你的html。就像這樣:

public static string myMethod(string input) 
{ 
    string result = "<div>" + 
     // ...snip 
     + input + 
     // ...snip 
     + "</div>"; 
    return result; 
} 
+2

我無法對此讚賞。 「HtmlHelpers」一直都是這樣擴展的。我到處看到它。即使這個框架使這個巨大的使用。 – 2013-05-06 11:35:39

+0

這意味着我需要將我的內容作爲字符串傳遞,它基本上消除了使用塊的邏輯的所有可能性。這個解決方案不會幫助。但是我確實同意我在這裏使用IDisposable的問題是不正確的,因此我在尋找替代方案 – 2013-05-06 11:37:33

+1

@DustyRoberts爲什麼當整個ASP.NET MVC框架使得這個問題(使用像這樣的IDisposable)到處使用它? – 2013-05-06 11:39:35