ASP.NET MVC - 将复杂控件转换为MVC友好型

时间:2011-11-01 21:02:51

标签: asp.net-mvc

我有一个ASP.NET WebForms控件(派生自Control,而不是WebControl,如果它有帮助),它有一个相当复杂的Render()函数。该控件没有viewstate,只使用Control方法,因此它可以直接呈现输出。我认为这是使用MVC方法的一个很好的候选人。

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

起初我考虑将其转换为HTML Helper方法,但是我的控件呈现了大量的HTML,因此Helper方法(返回字符串)不太有吸引力。

替代方案是PartialView,但这些是UserControl衍生产品,在这种情况下不合适。


我看到其他HTML Helper方法不返回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 个答案:

答案 0 :(得分:1)

您在问题中概述的两种方法是正确的。您可以尝试编写一个自定义HTML帮助程序,它将与控件吐出相同的HTML或使用部分HTML。

  

我看到其他HTML Helper方法不返回HtmlString,但实际上   使用HtmlHelper.ViewContext.Writer直接写输出

ViewContext.Writer应该没问题。从帮助者返回IHtmlString也没关系。只要确保你正确编码它,因为IHtmlString不会在Razor中自动进行HTML编码,它假设帮助程序负责这一点。使用TagBuilder在帮助器中生成DOM树是一种很好的方法。