2011-11-01 77 views
0

我有一個ASP.NET WebForms控件(派生自Control,不是WebControl,如果有幫助的話)具有相當複雜的Render()函數。該控件沒有視圖狀態,只使用Control方法,因此它可以直接渲染輸出。我覺得這是使用MVC方法的好選擇。ASP.NET MVC - 將複雜的控件轉換爲MVC友好的

我想在我正在使用的MVC應用程序中使用它,但是我不知道最好的解決方法是什麼。

起初我想過把它轉換成HTML Helper方法,但是我的控件渲染了大量的HTML,因此Helper方法(使用它返回字符串)並不太吸引人。

另一種方法是PartialView,但這些都是UserControl派生,在這種情況下不適合。


我看其他HTML輔助方法不返回HtmlString,但實際上使用HtmlHelper.ViewContext.Writer直接寫輸出,但根據這個問題(HtmlHelper using ViewContext.Writer not rendering correctly)他得到奇怪的結果。我想避免這種不幸。


編輯:

我想我已經使用HtmlHelper.ViewContext.Writer辦法解決它,我沒有經歷過同樣的問題,因爲我報的問題。

這是我寫的代碼:

public static class MiniViewHelper { 

    public static void RenderMiniView<TModel>(this HtmlHelper html, MiniView<TModel> view, TModel model) { 

     TextWriter wtr = html.ViewContext.Writer; 
     HtmlTextWriter hwtr = wtr as HtmlTextWriter; 
     if(hwtr == null) hwtr = new HtmlTextWriter(wtr); 

     view.Render(hwtr); 
    } 

} 

public abstract class MiniView<TModel> { 

    public TModel Model { get; set; } 

    public abstract void Render(HtmlTextWriter wtr); 

} 

public class VeryComplicatedMiniView : MiniView<ComplicatedViewModel> { 

    public override void Render(HtmlTextWriter wtr) { 

     wtr.WriteLine("VeryComplicatedMiniView "); 
    } 

} 

使用像這樣從我的網頁:

<% Html.RenderMiniView(new VeryComplicatedMiniView() { Propery1 = foo }, Model.RelevantMiniViewModel); %> 

有什麼想法?

回答

1

您在問題中列出的兩種方法都是正確的。您可以嘗試編寫一個自定義HTML助手,該助手將吐出與控件相同的HTML或使用部分。

我看其他HTML輔助方法不返回HtmlString,但實際上 使用HtmlHelper.ViewContext.Writer寫直接輸出

ViewContext.Writer應該罰款。從幫手中返回IHtmlString也很好。只要確保你在裏面正確地編碼它,因爲IHtmlString不會自動在Razor中進行HTML編碼,並且它假定幫助者處理這個問題。使用TagBuilder在助手中生成DOM樹是一種好方法。

+0

謝謝。我用我寫的解決問題的代碼修改了我的問題。你能給我一些反饋意見嗎?謝謝! – Dai