我有一个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 ); %>
有什么想法吗?
答案 0 :(得分:1)
您在问题中概述的两种方法是正确的。您可以尝试编写一个自定义HTML帮助程序,它将与控件吐出相同的HTML或使用部分HTML。
我看到其他HTML Helper方法不返回HtmlString,但实际上 使用HtmlHelper.ViewContext.Writer直接写输出
ViewContext.Writer
应该没问题。从帮助者返回IHtmlString
也没关系。只要确保你正确编码它,因为IHtmlString不会在Razor中自动进行HTML编码,它假设帮助程序负责这一点。使用TagBuilder
在帮助器中生成DOM树是一种很好的方法。