新疆软件开发

本站首页 软件开发 成功案例 公司新闻 公司简介 客服中心 软件技术 网站建设
  您现在的位置: 新疆二域软件开发公司 >> .Net技术 >> 文章正文

如何使用XSL来定义ASP.NET Web Control

     在开发Web Control的时候,经常需要在源代码中嵌入一些HTML代码, 比如这样(代码片段):

protected override void RenderContents(HtmlTextWriter output)
        {
            SPList myList = GetListByName(List);
            if (myList != null)
            {
                uint currentLanguageCode = getCurrentLanguageCode();
                output.WriteBeginTag("ul");
                output.WriteAttribute("class", "lng");
                output.WriteLine(HtmlTextWriter.TagRightChar);

                foreach (SPListItem item in myList.Items)
                {
                    if (uint.Parse((string)item["Language Code"]) != getCurrentLanguageCode())
                    {
                        output.WriteBeginTag("li");
                        output.WriteAttribute("class", (string)item["CSS Class"]);
                        output.WriteLine(HtmlTextWriter.TagRightChar);
                        output.WriteBeginTag("a");
                        output.WriteAttribute("href", ((Microsoft.SharePoint.Publishing.Fields.LinkFieldValue)item["Language URL"]).NavigateUrl);
                        output.WriteLine(HtmlTextWriter.TagRightChar);
                        output.Write((string)item["Title"]);
                        output.WriteEndTag("a");
                        output.WriteEndTag("li");
                    }
                }
                output.WriteEndTag("ul");
            }
        }

 

这个控件的HTML会输出成类似这样:


<ul class="lng">
  <li class="en">
    <a href="real-url-of-en">EN</a>
  </li>
  <li class="fr">
    <a href="real-url-of-fr">FR</a>
  </li>
</ul>

但是这样做有个问题,假如我们想改变这个web control的表现,比如把CSS Class从“lng” 改为“language”,那么我们就必须要在这个代码里面修改,并且需要重新编译,这样就带来了极大的不方便。我们需要一种能够不需要重新编译代码就可以改变HTML的方法。
这篇文章就介绍一种这样的方法,解决方案是XML + XSL

原理是,在上面方法中,我们不直接负责HTML输出,而是我们构建一个XML文件在内存中,然后我们需要自己编写一个XSL文件来定义这个XML的表现。 

具体这样:(一共两步)
1。 改写上面方法为:


protected override void RenderContents(HtmlTextWriter output)
        {
           
            SPList myList = GetListByName(List);
          
            if (myList != null)
            {
                try
                {
                    XslCompiledTransform transformer = new XslCompiledTransform();
                    string s = SPUtility.GetGenericSetupPath("TEMPLATE\\LAYOUTS") + XslFileRelativeUrl;
                    transformer.Load(s);
                    StringWriter result = new StringWriter();
                    XmlDocument mydoc = BuildXML(myList);
                    transformer.Transform(mydoc, null, result);
                    output.WriteLine(result.ToString());
                }
                catch (Exception ex)
                {
                    Page.Response.Write(ex.Message);
                }
            }
        }


其中的BuildXML()方法为:


//     <languages>
//       <language title="EN" code="1033" cssclass="en" url="en-url" />
//       <language title="FR" code="1036" cssclass="fr" url="fr-url" />
//     </languages>
public XmlDocument BuildXML(SPList myList)
        {
            if (myList != null)
            {
                XmlDocument doc = new XmlDocument();
                XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
                doc.AppendChild(docNode);
                XmlNode languagesNode = doc.CreateElement("languages");
                doc.AppendChild(languagesNode);

                foreach (SPListItem item in myList.Items)
                {
                    if (uint.Parse((string)item["Language Code"]) != getCurrentLanguageCode())
                    {
                        XmlNode languageNode = doc.CreateElement("language");

                        XmlAttribute languageAttribute = doc.CreateAttribute("title");
                        languageAttribute.Value = (string)item["Title"];
                        languageNode.Attributes.Append(languageAttribute);
                       
                        languageAttribute = doc.CreateAttribute("code");
                        languageAttribute.Value = (string)item["Language Code"];
                        languageNode.Attributes.Append(languageAttribute);
                       
                        languageAttribute = doc.CreateAttribute("cssclass");
                        languageAttribute.Value = (string)item["CSS Class"];
                        languageNode.Attributes.Append(languageAttribute);
                       
                        languageAttribute = doc.CreateAttribute("url");
                        languageAttribute.Value = ((Microsoft.SharePoint.Publishing.Fields.LinkFieldValue)item["Language URL"]).NavigateUrl;
                        languageNode.Attributes.Append(languageAttribute);
                       
                        languagesNode.AppendChild(languageNode);                     
                       
                    }
                }
                return doc;
            }
            else return null;
        }


2. 定义XSL文件:


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="UTF-8" indent="yes"/>
 <xsl:template match="/">
  <ul class="lng">
   <xsl:for-each select="languages/language">
    <li class="{@cssclass}">
     <a href="{@url}">
      <xsl:value-of select="@title"/>
     </a>
    </li>
   </xsl:for-each>
  </ul>
 </xsl:template>
</xsl:stylesheet>

这样就好了,以后想改HTML就直接改上面的XSL文件就可以了,再也不用重新编译了。而且这样做就把表现层的东西从代码中分离了,比较符合现代的软件设计思想。
可以看到上面这个控件是在SharePoint中用的,但是其思想完全不局限于SharePoint

作者:夏天的感… | 文章来源:cnblogs | 更新时间:2008-2-27 10:57:20

  • 上一篇文章:

  • 下一篇文章:

  • 相关文章:
    ,net基础类的学习:system.Web.Services
    WEB服务器配置方法学习
    介绍XML在Web页面中的应用
    软件技术
    · 开发语言
    · Java技术
    · .Net技术
    · 数据库开发
    最新文章  
    ·.net技术 asp.net MVC3 Vi
    ·.net将视频文件格式转换成
    ·NET Framework 2.0 Servic
    ·如何动态修改winform的app
    ·asp,net软件结构设计和相关
    ·学习怎样使用ASP.NET中的虚
    ·,net基础类的学习:system
    ·.net学习:c#事件的深入分
    ·Facade Pattern学习总结
    ·C#如何设置或者获取目录的
    ·如何使用XSL来定义ASP.NET
    ·理解WCF Data Contract契约
    ·如何能在.net2.0开发的控件
    ·模式怎样使用,讲解模式的
    ·如何解决Menu菜单被frame遮
    关于我们 | 软件开发 | 下载试用 | 客服中心 | 联系我们 | 友情链接 | 网站地图 | 新疆电子地图 | RSS订阅
    版权所有 © 2016 新疆二域软件开发网 www.k8w.net All Rights Reserved 新ICP备14003571号
    新疆软件开发总机:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆乌鲁木齐北京中路华联大厦A-5C 邮编:830000