Community Server 插件开发一-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

Community Server 插件开发一

简介:

经过前面的努力,我们终于始一张空白的页面出现在了CS系统里, 接下来就要在这个空白的页面里加入我们想要的内容的,通过对CS代码的解读,我们知道CS的内容块都是采用了WEB用户控件的方式,而且在CS中所用的所有的ascx文件和ASPX文件一样是没有直接的绑定代码的.打开一些CS项目中在Controls文件夹下的文件,这些就是真正的控件的实现代码,所有CS控件都是继承自TemplatedWebControl,它是CS实现换肤的基础.

CS中所有的项目中都对TemplatedWebControl进行了一次甚至多次的继承,为什么要多次继承,具体原因我还不是搞得很明白,估计是为了提高代码的可读性和重用性.

对我们来说一开始不要搞得太复杂,我简单的写了个类做为我们项目的控件的基类

 

 

None.gifusing System;
None.gif
using CommunityServer.Controls;
None.gif
using CommunityServer.Components; 
None.gif
None.gif
namespace Papersnake.LocalPhoto.Controls
ExpandedBlockStart.gif
{
InBlock.gif
public abstract class LocalPhotoTemplatedWebControl:TemplatedWebControl
ExpandedSubBlockStart.gif
{
InBlock.gif
public LocalPhotoTemplatedWebControl():base()
ExpandedSubBlockStart.gif

InBlock.gif
ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
protected override void OnLoad(EventArgs e)
ExpandedSubBlockStart.gif
{
InBlock.gif
base.OnLoad(e);
InBlock.gif
if (Context.Items["SetLocalPhotoLocation"== null)
ExpandedSubBlockStart.gif
{
InBlock.gifUsersOnline.SetLocation(
"My LocalPhoto"null);
InBlock.gifContext.Items[
"SetLocalPhotoLocation"= true;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
protected override string ExternalSkinFileName
ExpandedSubBlockStart.gif
{
InBlock.gif
get
ExpandedSubBlockStart.gif
{
InBlock.gif
return string.Format("/LocalPhotos/Skin-{0}.ascx"this.GetType().Name);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif

 

非常简单,唯一需要提一下的就是,ExternalSkinFileName的这个属性, 它指定了, 我们的CS控件从哪个文件夹下去找它的皮肤文件.

回到CS的WEB项目中Themes\default\Skins\建一个名为LocalPhotos的文件夹,注意这个文件夹的名称要和ExternalSkinFileName属性中的统一.

做好的准备工作,我们就要来写我们要的功能了,为了简单起见,我们就搞一个最简单的,用一个Repeater把我们在硬盘上搜索到的图片文件的文件名全显示出来,先不要去考虑什么数据库什么的,不然的话,可能先了N多的代码,就因为一个功能没有完成,你就得不到一次运行一下你程序的机会, 这是很郁闷的一件事情,很多时候,我们就会因此而半途而废了.

在LocalPhotos中新建一个Skin-PhotoAllList.ascx的文件

 

 

ExpandedBlockStart.gif<%@ Control %>
None.gif
<div class="CommonContentArea">
None.gif
<div class="CommonContent">
None.gif
<asp:Repeater ID="AllPhotoRepeater" runat="server">
None.gif
<ItemTemplate>
None.gif
<asp:Label ID="txtphypath" runat="server" /><br />
None.gif
</ItemTemplate>
None.gif
</asp:Repeater>
None.gif
</div>
None.gif
</div>

 

怎么样够简单吧, 就在里面另了一个名为AllPhotoRepeater的Repeater控件,在它的ItemTemplate中加一个名为txtphypath的子控件.完成了这个,又要回到我们自已的项目,为这个web用户控件写实现代码,也很简单,只是需要注意,这个类集成至我们的LocalPhotoTemplated,还有就是它的文件名必须和皮肤文件中Skin-PhotoAllList.ascx中的PhotoAllList统一,为什么这样,看一下我们LocalPhotoTemplated中的ExternalSkinFileName属性就明白了

 

 

None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Web.UI.WebControls; 
None.gif
None.gif
using Papersnake.LocalPhoto.Components; 
None.gif
None.gif
namespace Papersnake.LocalPhoto.Controls
ExpandedBlockStart.gif
{
InBlock.gif
public class PhotoAllList : LocalPhotoTemplatedWebControl
ExpandedSubBlockStart.gif
{
InBlock.gif
private Repeater AllPhotoRepeater;//定义一个Repeater控件
InBlock.gif
public PhotoAllList()
ExpandedSubBlockStart.gif

InBlock.gif
ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
protected override void OnLoad(EventArgs e)
ExpandedSubBlockStart.gif
{
InBlock.gif
if (!Page.IsPostBack)
InBlock.gif
this.DataBind();//在OnLoad中实现数据绑定
InBlock.gif
base.OnLoad(e);
ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
//这个方法是用来绑定皮肤文件中定义的控件的
InBlock.gif
protected override void AttachChildControls()
ExpandedSubBlockStart.gif
{
InBlock.gifAllPhotoRepeater 
= (Repeater)FindControl("AllPhotoRepeater");
InBlock.gifAllPhotoRepeater.ItemDataBound 
+= new RepeaterItemEventHandler(AllPhotoRepeater_ItemDataBound);
ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
void AllPhotoRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
ExpandedSubBlockStart.gif
{
InBlock.gifphoto tphoto 
= e.Item.DataItem as photo;
InBlock.gif
if (tphoto == null)
InBlock.gif
return;
InBlock.gif
switch (e.Item.ItemType)
ExpandedSubBlockStart.gif
{
InBlock.gif
case ListItemType.Item:
InBlock.gif
case ListItemType.AlternatingItem:
InBlock.gifLabel txtphypath 
= (Label)e.Item.FindControl("txtphypath");
InBlock.giftxtphypath.Text 
= e.Item.ItemIndex.ToString()+":"+tphoto.PhyPath;//把绑定的数据在Label中显示出来
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
public override void DataBind()
ExpandedSubBlockStart.gif
{
InBlock.gif
base.DataBind();
InBlock.gifBindData();
ExpandedSubBlockEnd.gif}

InBlock.gif
private void BindData()
ExpandedSubBlockStart.gif
{
InBlock.gifAllPhotoRepeater.DataSource 
= Photos.GetAllPhotos();
InBlock.gifAllPhotoRepeater.DataBind();
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif

 

运行效果
%E6%8D%95%E8%8E%B72_thumb%5B13%5D.jpg 
非常简单的一个类,但是我们已经完成了开发CS插件的第一步,接下去我们要做的就只是进一步更细致的设计,以完成我们所需要的功能








    本文转自无心之柳.NET博客园博客,原文链接:http://www.cnblogs.com/9527/archive/2007/04/06/703411.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章