随笔 - 35  文章 - 1 评论 - 94 trackbacks - 8



与我联系

搜索

 

常用链接

留言簿(6)

我参与的团队

随笔档案(35)

文章档案(1)

.NET英文资料

.NET中文资料

其他博客

最新随笔

积分与排名

  • 积分 - 43356
  • 排名 - 1063

最新评论

阅读排行榜

评论排行榜

Web Part 是asp.net 2.0中提供的新特性,通过它可以让最终用户自由修改页面布局,效果可以看看Google的自定义页面http://www.google.com/ig?hl=zh-CN,其使用也非常简单,下面就说一下两个Web part通讯方面的使用心得.

Web part进行通讯是由WebPartManager管理的。
    1。定义一个公共的接口,供通讯使用。
    2。WebPartManager通过发布者得到接口。
    3。WebPartManager传递接口给订阅者。
我做了个通过日历控件取得日期传递到另一个web part中的TextBox的实验,其中出了点问题。先看接口代码

using System;
using System.Data;



public interface ISelectedDate
{

    DateTime SelectedDate();
}

日历作为借口提供者,首先要实现接口,同时要通过 [ConnectionProvider("ISelectedDate", "DateInfoProvider")]来标记。ConnectionProvider中第一个参数为接口名,后一个为传递的参数。代码如下:

public partial class CalendarUC : System.Web.UI.UserControl,ISelectedDate
{
    DateTime _DateInfo 
= DateTime.Now;
    [Personalizable]
    
public DateTime DateInfo
    
{
        
get return _DateInfo; }
        
set { _DateInfo = value; }
    }



    [ConnectionProvider(
"ISelectedDate""DateInfoProvider")]
    
public ISelectedDate GetDate()
    
{
        
return this;
    }

    
public DateTime SelectedDate()
    
{
        
return _DateInfo;
    }

    
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    
{
        _DateInfo 
= this.Calendar1.SelectedDate;

    }




    
protected void Page_Load(object sender, EventArgs e)
    
{

    }

   
}


然后是消息订阅者应使用该消息,它需要通过[ConnectionConsumer("ISelectedDate", "DateInfoConsumer")]标记。代码如下:

public partial class google : System.Web.UI.UserControl
{
    
protected void Page_Load(object sender, EventArgs e)
    
{

    }

    
protected void Button1_Click(object sender, EventArgs e)
    
{
        Response.Write(Page.IsValid);
        
string queryStr=HttpUtility.UrlEncode(TextBox1.Text);
        Response.Redirect(
@"http://www.google.com/search?q=" +queryStr);

    }

    [ConnectionConsumer(
"ISelectedDate""DateInfoConsumer")]
    
public void GetDate(ISelectedDate SearchText)
    
{
       TextBox1.Text
= SearchText.SelectedDate().ToString();

    }

 
}

最后就是通过设置WebPartManager的属性来建立静态的连接。修改以下代码

<asp:WebPartManager ID="WebPartManager1" runat="server">  
        
<StaticConnections>
        
<asp:WebPartConnection ID="DataConnection" Runat="server"
 ProviderID
="CalendarUC2" ProviderConnectionPointID="DateInfoProvider" ConsumerID="Google1" ConsumerConnectionPointID="DateInfoConsumer" />
        
</StaticConnections>  

        
</asp:WebPartManager>

最后就是将WebPartManager的 DisplayMode 设置为WebPartManager.ConnectDisplayMode;
理论上讲,如果完成以上的步骤就应该完成了静态通讯的建立,但运行后发现会报以下错误。
The specified display mode is not supported on this page. Make sure
personalization is enabled and the corresponding zones are present on the
page. The display mode can be set during and after Page_Init.
Parameter name: value

不过再页面上加一个ConnectionZone控件就能解决这个问题,但是这样运行后会让最终用户看见这个ConnectionZone控件,总感觉有更好的办法,能完全通过代码建立连接,希望有好办法的朋友告诉我一下。

posted on 2005-12-21 20:50 圣炎¢天乐 阅读(2483) 评论(15)  编辑 收藏 网摘

FeedBack:
#1楼  2005-12-21 22:12 POLARIS      
潜在的问题
(1)ConnectionZone控件是在动态通信中使用的,您的示例中显然是一个静态通信,因此,没有必要添加该控件。
(2)两个WebPart之间进行通信,传输的是一个简单数值,因此,最好在接口中实现一个属性,这样比方法来得简单。
(3)既然是WebPart控件,那么建议provider和consumer都继承自WebPart类。
(4)不要把Page_Load等事件处理程序与WebPart通信中实现的接口、方法混在一起。
  回复  引用  查看    
#2楼 [楼主] 2005-12-21 22:28 圣炎¢天乐      
关于楼上的提到的第一点,也是我觉得有问题的地方,但是如果不加ConnectionZone控件,在运行是只要将WebPartManager的 DisplayMode 属性设置为WebPartManager.ConnectDisplayMode就会报文中提到的错,不知为什么.
  回复  引用  查看    
#3楼  2005-12-21 23:31 wow gold [未注册用户]
([url=http://www.sfwre.com]wow gold[/url])
([url=http://www.wowgoldue.com]wow gold[/url])([url=http://zxfan1898.bokee.com]wow gold[/url])
  回复  引用    
#4楼  2005-12-21 23:45 POLARIS      

通常情况下,ConnectionZone用于用户指定两个WebPart之间通信的变量之用。这恰恰说明了代码中存在的问题。
如果是我写这段程序,我会编写两个自定义WebPart控件,然后分别予以实现。下面我通过一个简单示例,说明实现要点。这些内容来自我目前正在编写的一本有关ASP.NET 2.0方面的书稿。
-------------------------------------------------------------------------------------------------------------------

假设创建一个由用户输入员工ID,查询该员工处理订单详情的示例。用户输入界面位于一个WebPart中,显示订单详情的界面位于另一个WebPart中。显然,前者中的WebPart是提供者,后者中的WebPart是订阅者。二者的交互过程是,首先,用户在提供者所在的WebPart中输入员工ID,然后,该值传递给订阅者,最后,订阅者根据获取的ID值,从数据库中获取相关数据并显示在页面上。下面是与实现通信机制有关的五个要点说明,其与WebPart通信机制密切相关。

1)定义接口

定义接口与通信过程中将要传输的对象有关。如果需要传输的仅仅是简单数值,那么在接口中只要定义一个简单属性即可。如果需要传输的是复杂对象,那么必须根据实际需求,定义接口成员。本示例中,提供者和订阅者之间传递的是整数类型的员工ID,因此,只要定义一个属性EmployeeID即可。下面是定义接口代码。

定义接口代码

public interface IEmployeeInfo

{

    int EmployeeID { get; set;}

}

2)在提供者中实现接口成员

在这一过程中,前提是实现提供者的类,不仅要声明继承自WebPart基类,而且还要声明实现前文定义的接口。在此基础上,才能够实现接口成员。接口只有一个成员EmployeeID,其在提供者类中的实现是很简单的,代码如下所示。

在提供者中实现接口成员代码

public class EmployeesWebPart : WebPart, IEmployeeInfo

{

    // 定义初始值

    private int _empID = 1;

    ......

    // 实现接口成员EmployeeID

    public int EmployeeID

    {

        get { return _empID; }

        set { _empID = value; }

    }

}

3)在提供者中实现[ConnectionProvider]方法

实现[ConnectionProvider]方法的核心是返回提供者实例,这样订阅者才可能由此获得传递的对象。另外,开发人员还必须在此回传方法上方添加ConnectionProvider特性设置,以此通知WebPartManager控件这里是提供者的连接点。同时,还可设置连接点显示名称DisplayName、连接点标识ID等内容。下面是本例中[ConnectionProvider]方法代码。在代码中已经设置DisplayNameID都等于EmployeeIDProvider。这些设置与WebPartManager中声明的StaticConnections关联。

实现[ConnectionProvider]方法代码

[ConnectionProvider("EmployeeIDProvider", "EmployeeIDProvider")]

public IEmployeeInfo ProvideEmployeeInfo()

{

    return this;

}

4)在订阅者中实现[ConnectionConsumer]方法

[ConnectionConsumer]方法的核心是调用来自提供者的数据对象,并使之与订阅者内部对象发生联系,由此才能更好利用传递的数据。开发人员必须在[ConnectionConsumer]方法上方添加ConnectionConsumer特性,以此告知WebPartManager控件这里是订阅者的连接点。同时,还可设置联结点名称DisplayName、连接点标识ID等内容。下面是本例中[ConnectionConsumer]方法代码。需要注意的是回传方法的声明,其只有一个参数(接口类型),并且返回值为空。同时,设置DisplayNameID都等于EmployeeIDConsumer。这些设置与WebPartManager中声明的StaticConnections关联。

实现[ConnectionConsumer]方法代码

[ConnectionConsumer("EmployeeIDConsumer", "EmployeeIDConsumer")]

public void GetEmployeeInfo(IEmployeeInfo empInfo)

{

    if (empInfo != null)

    {

        _empID = empInfo.EmployeeID;

    }

    else

    {

        throw new NotSupportedException("未能连接数据库.");

    }

}

5)在WebPartManager控件中声明连接

如果是创建基于静态连接的WebPart通信,那么在WebPartManager中声明连接是必须的。在声明过程中,主要设置的是提供者和订阅者的细节内容。例如,提供者标识ProviderID、提供者连接点ProviderConnectionPointID、订阅者标识ConsumerID、订阅者连接点ConsumerConnectionPointID等。下面是声明连接的代码。

声明连接代码

<asp:WebPartManager ID="WebPartManager1" runat="server">

    <StaticConnections>

        <asp:WebPartConnection ID="EmpConnection" ProviderID="EmployeesWebPart1" ProviderConnectionPointID="EmployeeIDProvider" ConsumerID="OrdersWebPart1" ConsumerConnectionPointID="EmployeeIDConsumer" />

    </StaticConnections>

</asp:WebPartManager>

如果开发人员创建的是基于动态连接的WebPart通信,则需要在页面中添加ConnectionsZone控件。该控件将能够自动为用户创建自定义连接对象的用户界面。
-------------------------------------------------------------------------------------------------------------------

不好意思,没有足够的时间和精力来实现你的代码。希望上面的内容能够帮助你。


  回复  引用  查看    
#5楼 [楼主] 2005-12-22 19:41 圣炎¢天乐      
谢谢POLARIS兄的帮助!
这个问题解决了,报错出在静态通讯不用设置WebPartManager的 DisplayMode 属性设置为WebPartManager.ConnectDisplayMode,只有动态通讯要设置这个属性以显示ConnectionsZone控件.
  回复  引用  查看    
#6楼  2005-12-23 14:50 POLARIS      
To 圣炎¢天乐:

说实话,我还是为你在代码中采用的方法表示担忧。总体感觉就是一个字,“乱”。不好意思,你别有什么意见,这只是我的个人感觉。虽然问题得到了解决,但是,总感觉不是很合适。如果我是你,我会重构一次。

  回复  引用  查看    
#7楼 [楼主] 2005-12-23 15:56 圣炎¢天乐      
恩,我会试试
  回复  引用  查看    
#8楼  2005-12-23 16:00 jdy [未注册用户]
POLARIS 编的书叫什么名字?什么时候出版?什么时候有幸学习学习!

  回复  引用    
#9楼  2005-12-24 17:25 POLARIS      
我的书稿目前已经写了810页,87万字了,还有几个章节需要撰写。然后,还需要修改、审稿,然后再出版。估计时间不会短,希望在明年3、4月份能够和读者见面。
至于书名,我想将其称为《ASP.NET 2.0开发技术教程》。不知道jdy有什么好的想法没有?
  回复  引用  查看    
#10楼  2006-07-23 21:40 aspnetx      
是否没有安装sqlserver2005express
你的成员服务都正常吗?
  回复  引用  查看    
#11楼  2006-08-14 19:31 zmsx      
没安装就不正常。不过安装vs2005时会自动安装sqlserver2005express
  回复  引用  查看    
#12楼  2007-04-12 13:17 df [未注册用户]
xcZ
  回复  引用    
#13楼  2007-05-25 12:04 dongdong [未注册用户]
请高手们指点,webpart有什么优点,我看了,但真没有发现他有说的那么好!
是我没有领会,尤其web part通信有有什么好的,和不就及联改变是吗?
  回复  引用    
#14楼  2007-08-08 14:47 萧亦然 [未注册用户]
@POLARIS
期待您得佳作!重构,值得学习。不知道webpart是否很有学习得价值。
  回复  引用    
WebPartManager进入ConnectDisplayMode模式后,WebPart菜单不能显示Connect动词,求解,先谢谢了~!
http://topic.csdn.net/u/20081113/11/cdd28fa5-4247-4677-b3d7-cc7223924762.html#
  回复  引用    




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:

相关链接: