MOSS2007开发之旅——WebParts

在开始WebParts开发之前,我们先了解一下MOSS的一些开发工具,然后再开始从简单到复杂的WebParts。

先插句对MOSS部分功能的认识。我目前接触的MOSS内容就像是一个建站系统,功能比普通的CMS要强大,它可以进行工作流。你创建的网站等所有信息也都是保存在DB中,它的对象模型都是以SP开头,如SPSite、SPWeb、SPList、SPListItem、SPField等,Site有Web集合,Web有List集合,List有Item集合和Field集合。安装MOSS后,所有的页面、模板、WebPart、程序集等都在C:\Program Files\Common Files\Microsoft Shared\web server extensions\12这个12文件夹中,你在IIS的虚拟目录中是看不到页面文件的。运行SP程序的是w3wp.exe这个进程而不是运行aspnet_ap.exe。

开发工具

使用这些工具,会使你在以后的MOSS开发中非常顺手。

1. Visual Studio extensions for Windows SharePoint Services

 Visual Studio extensions for Windows SharePoint Services(点击链接可以下载)是开发自定义SP程序的工具。安装后会集成在VS2008中(VS2010 Beta2已经集成),它提供了工程模板、项目模板和SP方案建造器,这些模板会自动生成bat文件、Feature.xml和Manifest.xml文件,右键点击工程选择deploy命令就会自动部署程序。通过View菜单其他工具可以找到WSP视图,WSP BuilderSTSDEV工具可以帮助你维护Feature.xml和Manifest.xml文件,部署是会产生Web solution package (WSP),只要将这个包发给用户,让他自己在服务器上运行即可以轻松部署你开发的功能。

1> 工程模板:

  • Web Part
  • Team Site Definition
  • Blank Site Definition
  • List Definition TDGSF
  • Empty SharePoint Project

2> 项目模板:

  • Web Part
  • Custom Field
  • List Definition (with optional Event Receiver)
  • Content Type (with optional Event Receiver)
  • Module
  • List Instance
  • List Event Handler
  • Template

3> SP方案建造器:

大家可以用它产生一个站点。更多关于使用的信息可以下载用户向导Visual Studio extensions Windows SharePoint Services User Guide.

2. CAML Query Tools

Collaborative Application Markup Language (CAML) 其实就是为查询SPList数据的XML标记语言。下面是生成CAML的工具:

更多关于CAML的信息, 请看MSDNCollaborative Application Markup Language Core Schemas

3. SharePoint Designer

可以设计工作流,编辑模板等,更多信息请看Microsoft Office SharePoint Designer

4. 更多链接

WebPart

关于WebPart的部署,大家可以看高维鹏(Brian)SharePoint 2007图文开发教程(3)---实现简单的WebPart,这里我只讲代码。

1. Hello WebPart

新建一个WebPart模板类库,添加一个WebPart项目,Hello类继承System.Web.UI.WebControls.WebParts.WebPart。功能是在页面中输出"Hello WebPart World!”。注意,其中AssemblyInfo.cs后面一定要有 [assembly: System.Security.AllowPartiallyTrustedCallers()] 这一句,否则WebPart将无法使用。

public class Hello : WebPart
{
    string text = "Hello WebPart World!";

    [WebBrowsable(true), Personalizable(true)]
    public string Text
    {
        get { return text; }
        set { text = value; }
    }

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        writer.Write(text);
    }
}

2. 高级WebPart

这个WebPart我们将要表演如下节目:

  • 在WebPart中显示站点“Test”列表中的“Name”字段
  • 单击每个项目将该内容显示在上面创建的Hello部件中

这是一个带事件的WebPart,同时将数据传送到页面另外一个WebPart中显示,继承WebPart控件的同时还要实现IPostBackEventHandler接口。

public class List : WebPart, IPostBackEventHandler
{
    private List<string> nameList = new List<string>();
    private HtmlTableCell tableCell = new HtmlTableCell();

    public List()
    {
        using (SPWeb web = SPContext.Current.Web)
        {
            SPList testList = web.Lists["Test"];
            //"Test"为Test列表的名称
            foreach (SPListItem item in testList.Items)
            {
                Guid nameId = item.Fields["Name"].Id;
                //"Name"为Name字段的显示名称
                nameList.Add(item[nameId].ToString());
            }
        }
    }

    protected override void CreateChildControls()
    {
        this.Controls.Add(new LiteralControl("<table><tr>"));
        this.Controls.Add(tableCell);
        this.Controls.Add(new LiteralControl("</tr></table>"));

        if (!Page.IsPostBack)
        {
            AddNameItems();
        }
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        if (Page.IsPostBack)
        {
            AddNameItems();
        }
    }

    private void AddNameItems()
    {
        string html = "<ul>";

        foreach (string name in nameList)
        {
            html += string.Format(
                "<li style=\"cursor:pointer\" onclick=\"{0}\">{1}</li>",
                Page.ClientScript.GetPostBackEventReference(this, name), name);
        }

        html += "</ul>";

        tableCell.Controls.Add(new LiteralControl(html));
    }

    #region IPostBackEventHandler Members

    public void RaisePostBackEvent(string eventArgument)
    {
        for (int i = 0; i < WebPartManager.WebParts.Count; i++)
        {
            if (WebPartManager.WebParts[i].Title == "Hello")
            {
                Hello hello = (Hello)WebPartManager.WebParts[i];
                hello.Text = eventArgument;
            }
        }
    }

    #endregion
}

关于WebPart的更多内容,如AJAX Web Parts,请参考Inside Microsoft Windows SharePoint Services 3.0

posted @ 2009-10-30 12:51  known  阅读(2767)  评论(12编辑  收藏  举报