现在的位置: 首页 > 综合 > 正文

基于UserControl模式快速创建Web Part(转)

2013年02月03日 ⁄ 综合 ⁄ 共 5332字 ⁄ 字号 评论关闭

出处:http://www.cnblogs.com/nickice/articles/839951.html

在《创建自己的Webpart》一文中,已经介绍过创建Web Part的步骤,以及如何部署Web Part。但是,如果深入就会发现,创建一个复杂的Web Part其实是很麻烦的事情。尤其是在该模式下,Web Part的子控件或者内容都是依靠重载CreateChildControls或者RenderWebPart方法来进行输出。而WSS/OSS开发的一个很重要的方面就是对Web Part的开发。而根据目前流行的开发模式,就是前后台分离,这样的Web Part 开发不利于分工。尤其Web开发注重的界面,很难实现代码人员与美工人员的协同。采用基于UserControl的方式来创建Web Part不失为一个好的办法。
 
一、创建用户控件
 
在Visual Studio 2005(VS 2005)IDE环境中,文件-》新建-》网站-》空网站,在【位置】处选择【文件系统】方式,然后确定即可。就自动生成一个解决方案和一个空白的Web项目。
 
在空白项目上右键,【添加新项】,选择【Web 用户控件】。在Independent.ascx页面文件中,代码如下:
 
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Independent.ascx.cs" Inherits="Independent" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
 
在文件Independent.ascx.cs中,代码如下:
 
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class Independent : System.Web.UI.UserControl
{
    protected void Button1_Click(object sender, EventArgs e)
    {
        //显示文本框内容
        ShowMessage(Page, this.TextBox1.Text);
    }
    public static void ShowMessage(System.Web.UI.Page page, string strMessage)
    {
        strMessage = strMessage.Replace(@"/", @"//");
        strMessage = strMessage.Replace("/r/n", "//r//n");
        page.Response.Write("<script language=/"javascript/">/r");
        page.Response.Write("alert(/"" + strMessage + "/");/r");
        page.Response.Write("</script>/r");
    }
}
 
二、创建Web Part壳
 
有了用户控件,这个用户控件与普通的用户控件一摸一样,没有做任何改变。我们如何使用它,使其成为一个可用的Web Part的一部分,我们需要为其创建一个Web Part的"壳"。为什么叫"壳",看完后面的介绍,也就不言自明了。
 
在现有的解决方案中,文件-》新建-》项目-》类库,按照在《创建自己的Webpart》中的步骤,创建一个Web Part。代码如下:

    #region 示例:动态加载UserControl
    /// <summary>
    /// 示例4:动态加载UserControl
    /// </summary>
    public class UserControlShell : WebPart
    {
        private string _UserControlSource = @"/_app_bin/UserControls/Independent.ascx";

        [WebBrowsable(true), Personalizable(true)]
        public string ControlSource
        {
            get { return _UserControlSource; }
            set { _UserControlSource = value; }
        }
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            if (_UserControlSource == null || _UserControlSource.Length == 0) return;
            this.Controls.Clear();
            try
            {
                //这个位置是虚拟路径
                this.Controls.Add(Page.LoadControl(_UserControlSource));
            }
            catch (Exception ex)
            {
                Page.Response.Write(ex.Message);
            }
        }
        protected override void Render(HtmlTextWriter writer)
        {
            base.Render(writer);
        }
    }
    #endregion
 
三、部署Web Part和用户控件
 
部署的方式在《创建自己的Webpart》中也作了介绍。将编译好的Web Part的DLL文件拷贝到_app_bin目录下,然后修改Web Application下的Web.config文件,将Web Part注册为安全的控件。下面是我的注册码:
      <SafeControl Assembly="VeryTech.WebParts.Samples, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c6479bda421222b8" Namespace="VeryTech.WebParts.Samples" TypeName="*" Safe="True" AllowRemoteDesigner="True" />
 
在部署完成后,如何使用用户控件呢?还需要将用户控件也拷贝的Web Application所指的主目录下的相应位置。这个位置可以打开IIS.MSC来查看。
 
根据示例中的代码,我们在_app_bin目录下新建文件夹UserControls,然后找到刚才创建的用户控件文件Independent.ascx和Independent.ascx.cs拷贝到UserControls文件夹下。当然,这个位置可以是[system drive/]Inetpub/wwwroot/wss/VirtualDirectories/80下的任何位置,可以通过在Web Part的ControlSource属性来设置用户控件的来源。
 
四、测试用户控件
 
将Web Part加入到Web 部件库,并添加到页面上。在TextBox中输入"Hello World",点击按钮试验一下。不错,对话框出现。嘿嘿:)
 
五、扩展用户控件功能
 
至此,我们已经知道为什么刚才那个Web Part要叫作"壳"或者"Shell"了。因为,我们的主要工作都交给用户控件去做了,刚才那个Web Part的功能仅仅是去Load一下用户控件,别的什么事也不做。
 
1.创建类文件
 
现在,这个用户控件还比较简单,我们稍微将其实用化一下。在用户控件项目上右键,【添加新项】,选择【类】。按系统默认,将新建的类文件放在App_Code目录下。然后再在这个项目中添加对Microsoft.SharePoint.dll的引用。在类文件中添加如下代码:
 
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Utilities;
 
namespace VeryTech.WebParts
{
    /// <summary>
    /// SPWebHelper 的摘要说明
    /// </summary>
    public class SPWebHelper
    {
        public SPWebHelper()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        public int Add(int a, int b)
        {
            return a + b;
        }
        public string GetList(HttpContext Context)
        {
            SPSite site = SPControl.GetContextSite(Context);
            string rtn = string.Empty;
            SPListItemCollection listItems = site.AllWebs[0].Lists["共享文档"].Items;
            foreach (SPListItem list in listItems)
            {
                rtn += list.Name + ";";
            }
            return rtn;
        }
    }
}
2.修改用户控件
 
修改用户控件的代码文件Independent.ascx.cs的内容如下:
 
添加引用:
 
using VeryTech.WebParts;
 
修改代码:
 
protected void Button1_Click(object sender, EventArgs e)
    {
        string rtn = string.Empty;
        try
        {
            rtn = new SPWebHelper().GetList(Context);
        }
        catch(Exception exc)
        {
            rtn = exc.Message;
        }
        this.TextBox1.Text = rtn;
    }
 
3.部署类文件
 
在做完这些之后,将用户控件文件按照之前的步骤更新到相应的位置。但是我们该把那个类文件放在哪儿呢?如果你放到与用户控件相同位置下,保管你不会成功。考虑到Asp 2.0的编译模式,在网站(WSS的Web应用)的主目录下,建立App_Code目录,将该类文件放在这个位置。测试,大功告成。在TextBox文本框中得到了共享文档的文件名。
 
 
结束:从这个过程可以看出,这种Web Part开发模式基本实现了分层的模式。用户控件的展现层,也就是ascx文件由美工去负责,页面上的内容数据源,也就是用户控件的cs文件的内容由编程人员完成。而编码这部分,也还可以进行分工(就是后面的专用类可以有人专门负责)。这样一来,分工就比较明晰了。同时,也提高了开发效率。还有一个优点就是调试也比较方便,尤其是对界面的调试(随便将用户控件拖到一个页面上就可以了)。

抱歉!评论已关闭.