public voID Render(HTMLTextWriter writer) { writer .Tag(HTMLTextWriterTag.div,e => e[HTMLTextWriterattribute.ID,"ID"][HTMLTextWriterattribute.name,"name"][HTMLTextWriterattribute.Class,"class"]) .Tag(HTMLTextWriterTag.Span) .Text("Lorem") .EndTag() .Tag(HTMLTextWriterTag.Span) .Text("ipsum") .EndTag() .EndTag(); }
“Tag”,“Text”和“EndTag”是HTMLTextWriter类的扩展方法,它返回所需的实例,以便可以链接调用.传递给在第一次调用“Tag”时使用的重载中使用的lambda的参数是一个“HTMLAttributeManager”,它是一个简单的类,它包装一个HTMLTextWriter来提供一个索引器,它使用一个HTMLTextWriterattribute和一个字符串值,并返回实例那个电话可以链接.我也有这个类的最常见属性的方法,如“名称”,“类”和“ID”,以便您可以按如下方式编写第一个调用:
.Tag(HTMLTextWriterTag.div,e => e.ID("ID").name("name").Class("class"))
一个更长的例子:
public voID Render(HTMLTextWriter writer){ writer .Tag(HTMLTextWriterTag.div,a => a.Class("someClass","someOtherClass")) .Tag(HTMLTextWriterTag.H1).Text("Lorem").EndTag() .Tag(HTMLTextWriterTag.Select,t => t.ID("fooSelect").name("fooSelect").Class("selectClass")) .Tag(HTMLTextWriterTag.Option,t => t[HTMLTextWriterattribute.Value,"1"][HTMLTextWriterattribute.Title,"Selects the number 1."]) .Text("1") .EndTag(HTMLTextWriterTag.Option) .Tag(HTMLTextWriterTag.Option,"2"][HTMLTextWriterattribute.Title,"Selects the number 2."]) .Text("2") .EndTag(HTMLTextWriterTag.Option) .Tag(HTMLTextWriterTag.Option,"3"][HTMLTextWriterattribute.Title,"Selects the number 3."]) .Text("3") .EndTag(HTMLTextWriterTag.Option) .EndTag(HTMLTextWriterTag.Select) .EndTag(HTMLTextWriterTag.div);}
希望您能够“破译”这个代码片段输出的HTML,至少是这样的想法.
请给我任何关于语法如何改进的想法,也许更好的方法名称,或许一些其他的方法.
编辑:
我认为看到同样的片段可能没有使用流畅的界面可能是有趣的比较:
public voID RenderUsingHTMLTextWriterStandardMethods(HTMLTextWriter writer){ writer.AddAttribute(HTMLTextWriterattribute.Class,"someClass someOtherClass"); writer.RenderBeginTag(HTMLTextWriterTag.div); writer.RenderBeginTag(HTMLTextWriterTag.H1); writer.Write("Lorem"); writer.RenderEndTag(); writer.AddAttribute(HTMLTextWriterattribute.ID,"fooSelect"); writer.AddAttribute(HTMLTextWriterattribute.name,"fooSelect"); writer.AddAttribute(HTMLTextWriterattribute.Class,"selectClass"); writer.RenderBeginTag(HTMLTextWriterTag.Select); writer.AddAttribute(HTMLTextWriterattribute.Value,"1"); writer.AddAttribute(HTMLTextWriterattribute.Title,"Selects the number 1."); writer.RenderBeginTag(HTMLTextWriterTag.Option); writer.Write("1"); writer.RenderEndTag(); writer.AddAttribute(HTMLTextWriterattribute.Value,"2"); writer.AddAttribute(HTMLTextWriterattribute.Title,"Selects the number 2."); writer.RenderBeginTag(HTMLTextWriterTag.Option); writer.Write("2"); writer.RenderEndTag(); writer.AddAttribute(HTMLTextWriterattribute.Value,"3"); writer.AddAttribute(HTMLTextWriterattribute.Title,"Selects the number 3."); writer.RenderBeginTag(HTMLTextWriterTag.Option); writer.Write("3"); writer.RenderEndTag(); writer.RenderEndTag(); writer.RenderEndTag();}
编辑:
我可能会更明确一点,因为这样做的目的之一是尽可能少的开销,这就是为什么我限制了使用lambdas的原因.另外起初我使用一个代表一个标签的类,以便在渲染之前通过语法构建与DOM树类似的东西,但语法非常相似.我放弃了这个解决方案,造成轻微的内存开销.在使用HTMLAttributeManager类中还有一些存在,我一直在考虑使用扩展方法来附加属性,但是我不能使用索引器语法,它也使HTMLTextWriter的接口膨胀更.
>重复使用Tag(Tagname,…).为什么不为每个标签名称提供扩展方法?诚然,这使得界面膨胀,并且写得很多(=>代码生成!).
>编译器/ IDE不能帮助你.特别地,它不检查缩进(当您自动缩进时甚至会破坏它).
这两个问题也许可以通过使用Lambda方法来解决:
writer.Write(body => new Tag[] { new Tag(h1 => "Hello,world!"),new Tag(p => "Indeed. What a lovely day.",new Attr[] { new Attr("style","color: red") })});
这只是一个基本的方法. API肯定需要更多的工作.特别地,由于参数名称冲突,嵌套相同的标签名称将不起作用.此外,这个界面不能很好的工作(或者根本就不用VB).但是,对于其他现代.NET API,即使是来自Microsoft的PliNQ接口也是如此.
另一种我以前想过的方法实际上是试图效仿马卡比,就像sambo的代码一样.主要区别在于我使用块而不是foreach,因此使用RAII:
using (var body = writer.body("xml:lang","en")) { using (var h1 = body.h1()) h1.AddText("Hello,World!"); using (var p = body.p("style","color: red")) p.AddText("Indeed. What a lovely day.");}
该代码没有其他方法的问题.另一方面,它为属性提供了更少的类型安全性和较不优雅的界面(对于“优雅”的给定定义).
我得到两个代码来编译,甚至产生一些或多或少有意义的输出(即:HTML!).
总结以上是内存溢出为你收集整理的.net – 用于呈现HTML的流畅界面全部内容,希望文章能够帮你解决.net – 用于呈现HTML的流畅界面所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)