2011-11-01 83 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