2011-02-08 71 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(); 
}