2011-02-08 52 views
0

我想在MVC3中編譯自己的控件集。因此,我不想爲所有這些擴展創建HTML Helper擴展,我想我會模仿其他框架(Telerik,DevExpress)的行爲。所以我創建了一個新的助手擴展來提供我的Item類;如何渲染()而不是ToString()

public static IFriendlyComponentFactory Factory(this HtmlHelper helper) 
     { 
      return new FriendlyComponentFactory(helper.ViewContext); 
     } 

,然後從內這裏我提供了我的目標,所以我可以設置屬性等

如果我把@ Html.Factory()。網格(),請將.Name( 「測試」)

然後我得到;

MyTest.Extensions.Grid 

我明白的是ToString()行爲。所以,我將ToString更改爲輸出;

new MvcHtmlString("<h3>Test</h3>").ToString() 

好吧,我得到了HTML完全編碼,所以我看到我的標籤和所有的頁面。嗯。

我可以在Telerik的源代碼中看到(我試圖弄清楚自己)他們正在處理ToString()並且似乎在輸出HTML,但是我可以看到工作在渲染中完成以輸出到ViewContext編寫器,而不是ToString()的輸出。

最後,我試了一下;

@{ Html.Factory().Grid().Render(); } 

而且我直接寫了ViewContext.Writer。多田,我得到了HTML輸出。

但是,我不想將代碼括起來,我想了解如何提供更乾淨的界面。

任何想法,我可以提供這個?

回答

1

爲你的類實現IHtmlString接口。但請注意,直接寫入輸出速度更快,因此請記住大型控件。

+0

我在想,寫輸出是我想要走的路,但我不太明白我是如何實現這一目標的。我如何獲得寫入輸出的能力,但是放入; @ Html.Factory()。Grid()在我看來? – Hammerstein 2011-02-08 15:58:31

1

覆蓋的隱式轉換爲字符串,返回渲染:

public static implicit operator string(MyTest.Extensions.Grid g) 
{ 
    return g.Render(); 
} 

或重寫ToString():

public string ToString() 
{ 
    return g.Render(); 
}