在《
创建自己的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文件的内容由编程人员完成。而编码这部分,也还可以进行分工(就是后面的专用类可以有人专门负责)。这样一来,分工就比较明晰了。同时,也提高了开发效率。还有一个优点就是调试也比较方便,尤其是对界面的调试(随便将用户控件拖到一个页面上就可以了)。
相关推荐
开发人员可以轻松地将这些控件拖放到页面上,快速创建可交互的Web Part页面。 - WebPartManager:协调页面上所有Web Part的行为。 - WebPartZone:定义Web Part在页面上的容器区域。 - PageCatalogPart、...
2.5.2 创建Web项目 2.5.3 迁移旧版Visual Studio创建的网站 2.6 Visual Studio调试 2.6.1 单步调试 2.6.2 变量监视 2.6.3 高级断点 2.7 WebDevelopment Helper 2.8 总结 第3章 Web窗体 3.1 页面...
组件开发,特别是在ASP.NET中,通常指的是创建自定义服务器控件、用户控件(User Control)或者Web部件(Web Part)。用户控件是可重用的HTML片段,可以包含多个服务器控件。Web部件则更加强调交互性和可配置性,常...
描述中提到的“快速在SharePoint上安装usercontrol”,表明我们要学习如何快速部署和使用SharePoint中的用户控件(User Control)。用户控件是ASP.NET中的一种自定义UI元素,它允许开发者组合和重用HTML元素、服务器...
20.1.2 部分页面(UserControl) 的高速缓存682 20.1.3 Post-Cache Substitution683 20.1.4 HttpCachePolicy和 客户端高速缓存685 20.2 编程高速缓存687 20.2.1 使用Cache对象 高速缓存数据687 20.2.2 高速...
14.1 基于XML的站点地图 461 14.2 SiteMapPath 服务器控件 463 14.2.1 PathSeparator属性 465 14.2.2 PathDirection 属性 467 14.2.3 ParentLevelsDisplayed属性 467 14.2.4 ShowToolTips属性 468 14.2.5 ...
Struts can help you control change in your Web project and promote specialization. Even if you never implement a system with Struts, you may get some ideas for your future servlets and JSP page ...
14.5.4. Using Metacommands to Control Filter or Validator Rules 14.5.4.1. The FIELDS metacommand 14.5.4.2. The PRESENCE metacommand 14.5.4.3. The DEFAULT_VALUE metacommand 14.5.4.4. The ALLOW_...
如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。 /add 创建新的分区。 /delete 删除现有分区。 device_name 要创建或删除分区的设备。设备名称可从 map 命令的输出...