web部件是ASP.NET WebForm里面的服务器控件,它涵盖的内容比较多,鉴于这种状况的话鄙人不打算深究下去了,只是局限于了解web.config配置里面的配置内容则可。

那么也得稍微说说啥是Web部件。引用MSDN的话:ASP.NET Web 部件是一组集成控件,用于创建网站使最终用户可以直接从浏览器修改网页的内容、外观和行为。这些修改可以应用于网站上的所有用户或个别用户。还有引用它上面的插图

看了这个之后我就感觉就类似于QQ个人空间上的各个面板或者OA系统上的面板,可以按照每个用户的个人喜好去更改显示的内容,位置以及是否显示

更多关于Web部件的内容可参考本篇后面的参考的MSDN文章。关于Web部件的的WebPartManager和webParetZone就不说了,接下来则看看webParts配置节的内容

配置分两大块,personalization的是关于个性化设置数据的提供以及用户访问权限的;另一个是关于web部件连接的时候数据结构不一致需要转换的配置。

下面则先看看personalization的,这个例子是参考了MSDN。实现的效果大概是记录用户个性化数据,以及对数据的权限控制,本例子包含一个登录页面,一个示例页面,两个用户控件。

首先示例页面的内容如下

登录页面只是包含了一个登录控件

用于展现用户个性化设置的自定义控件 Color

<%@ Control Language="C#" %><script runat="server">// User a field to reference the current WebPartManager.
    private WebPartManager _manager;//  Defines personalized property for User scope. In this case, the property is//   the background color of the text box.
    [Personalizable(PersonalizationScope.User)]public System.Drawing.Color UserColorChoice{get{return _coloruserTextBox.BackColor;}set{_coloruserTextBox.BackColor = value;}}// Defines personalized property for Shared scope. In this case, the property is//   the background color of the text box.
    [Personalizable(PersonalizationScope.Shared) ]public System.Drawing.Color SharedColorChoice{get{return _colorsharedTextBox.BackColor;}set{_colorsharedTextBox.BackColor = value;}}void Page_Init(object sender, EventArgs e){_manager = WebPartManager.GetCurrentWebPartManager(Page);       }protected void Page_Load(object src, EventArgs e) {// If Web Parts manager scope is User, hide the button that changes shared control.if (_manager.Personalization.Scope == PersonalizationScope.User){_sharedchangeButton.Visible = false;if (!_manager.Personalization.IsModifiable)_userchangeButton.Enabled = false;}else{_sharedchangeButton.Visible = true; if (!_manager.Personalization.IsModifiable){_sharedchangeButton.Enabled = false;_userchangeButton.Enabled = false;}} }// Changes color of the User text box background when button clicked by authorized user.
    protected void _userButton_Click(object src, EventArgs e){switch(_coloruserTextBox.BackColor.Name){case "Red":_coloruserTextBox.BackColor = System.Drawing.Color.Yellow;break;case "Yellow":_coloruserTextBox.BackColor = System.Drawing.Color.Green;break;case "Green":_coloruserTextBox.BackColor = System.Drawing.Color.Red;break;}}// Changes color of the Shared text box background when button clicked by authorized user.
    protected void _sharedButton_Click(object src, EventArgs e){switch (_colorsharedTextBox.BackColor.Name){case "Red":_colorsharedTextBox.BackColor = System.Drawing.Color.Yellow;break;case "Yellow":_colorsharedTextBox.BackColor = System.Drawing.Color.Green;break;case "Green":_colorsharedTextBox.BackColor = System.Drawing.Color.Red;break;}        }   </script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>WebParts Personalization Example</title>
</head>
<body>
<p><asp:LoginName ID="LoginName1" runat="server" BorderWidth="500" BorderStyle="none" /><asp:LoginStatus ID="LoginStatus1" LogoutAction="RedirectToLoginPage" runat="server" />
</p><asp:Label ID="ScopeLabel" Text="Scoped Properties:" runat="server" Width="289px"></asp:Label><br /><table style="width: 226px"><tr><td><asp:TextBox ID="_coloruserTextBox" Font-Bold="True" Height="110px" runat="server" Text="User Property" BackColor="red" Width="110px" /> </td><td>       <asp:TextBox ID="_colorsharedTextBox" runat="server" Height="110px" Width="110px" Text="Shared Property" BackColor="red" Font-Bold="true" /></td></tr><tr><td><asp:Button Text="Change User Color" ID="_userchangeButton" runat="server" OnClick="_userButton_Click" /></td><td ><asp:Button Text="Change Shared Color" ID="_sharedchangeButton" runat="server" OnClick="_sharedButton_Click" /></td></tr></table>
</body>
</html>

用于显示用户个性化数据权限的自定义控件Persmode

  1 <%@ control language="C#" %>
  2
  3 <script runat="server">
  4
  5  // Use a field to reference the current WebPartManager.
  6   private WebPartManager _manager;
  7
  8     protected void Page_Load(object src, EventArgs e)
  9     {
 10         // Get the current Web Parts manager.
 11         _manager = WebPartManager.GetCurrentWebPartManager(Page);
 12
 13         // All radio buttons are disabled; the button settings show what the current state is.
 14         EnterSharedRadioButton.Enabled = false;
 15         ModifyStateRadioButton.Enabled = false;
 16
 17         // If Web Parts manager is in User scope, set scope button.
 18         if (_manager.Personalization.Scope == PersonalizationScope.User)
 19             UserScopeRadioButton.Checked = true;
 20         else
 21             SharedScopeRadioButton.Checked = true;
 22
 23         // Based on current user rights to enter Shared scope, set buttons.
 24         if (_manager.Personalization.CanEnterSharedScope)
 25         {
 26             EnterSharedRadioButton.Checked = true;
 27             No_Shared_Scope_Label.Visible = false;
 28             Toggle_Scope_Button.Enabled = true;
 29         }
 30         else
 31         {
 32             EnterSharedRadioButton.Checked = false;
 33             No_Shared_Scope_Label.Visible = true;
 34             Toggle_Scope_Button.Enabled = false;
 35         }
 36
 37         // Based on current user rights to modify personalization state, set buttons.
 38         if (_manager.Personalization.IsModifiable)
 39         {
 40             ModifyStateRadioButton.Checked = true;
 41             Reset_User_Button.Enabled = true;
 42         }
 43         else
 44         {
 45             ModifyStateRadioButton.Checked = false;
 46             Reset_User_Button.Enabled = false;
 47         }
 48     }
 49   // Resets all of a user and shared personalization data for the page.
 50     protected void Reset_CurrentState_Button_Click(object src, EventArgs e)
 51     {
 52         // User must be authorized to modify state before a reset can occur.
 53         //When in user scope, all users by default can change their own data.
 54         if (_manager.Personalization.IsModifiable)
 55         {
 56             _manager.Personalization.ResetPersonalizationState();
 57         }
 58     }
 59
 60     // Allows authorized user to change personalization scope.
 61     protected void Toggle_Scope_Button_Click(object sender, EventArgs e)
 62     {
 63         if (_manager.Personalization.CanEnterSharedScope)
 64         {
 65             _manager.Personalization.ToggleScope();
 66         }
 67
 68     }
 69 </script>
 70 <div>
 71     &nbsp;<asp:Panel ID="Panel1" runat="server"
 72     Borderwidth="1"
 73     Width="208px"
 74     BackColor="lightgray"
 75     Font-Names="Verdana, Arial, Sans Serif" Height="214px" >
 76     <asp:Label ID="Label1" runat="server"
 77       Text="Page Scope"
 78       Font-Bold="True"
 79       Font-Size="8pt"
 80       Width="120px" />&nbsp;<br />
 81
 82
 83       <asp:RadioButton ID="UserScopeRadioButton" runat="server"
 84         Text="User"
 85         AutoPostBack="true"
 86         GroupName="Scope"
 87          Enabled="false" />
 88       <asp:RadioButton ID="SharedScopeRadioButton" runat="server"
 89         Text="Shared"
 90         AutoPostBack="true"
 91         GroupName="Scope"
 92         Enabled="false" />
 93         <br />
 94         <asp:Label BorderStyle="None" Font-Bold="True" Font-Names="Courier New" ID="No_Shared_Scope_Label" Font-Size="Smaller" ForeColor="red"
 95            runat="server" Visible="false" Width="179px">User cannot enter Shared scope</asp:Label>
 96         <br />
 97         <asp:Label ID="Label2" runat="server"
 98       Text="Current User Can:"
 99       Font-Bold="True"
100       Font-Size="8pt"
101       Width="165px" />
102       <br />
103         <asp:RadioButton ID="ModifyStateRadioButton" runat="server"
104         Text="Modify State" Width="138px" />
105         <br />
106         <asp:RadioButton ID="EnterSharedRadioButton" runat="server"
107         Text="Enter Shared Scope"
108         AutoPostBack="true"  />&nbsp;<br />
109         <br />
110         <asp:Button ID="Toggle_Scope_Button" OnClick="Toggle_Scope_Button_Click" runat="server"
111             Text="Change Scope" Width="186px" /><br />
112         <br />
113         <asp:Button ID="Reset_User_Button" OnClick="Reset_CurrentState_Button_Click" runat="server"
114             Text="Reset Current Personalization" Width="185px" /></asp:Panel>
115     &nbsp; &nbsp;
116 </div>

最后少不了的就是在web.config中添加配置

在这里开始吹水了,首先MSDN上面例子没提及到要添加认证的配置,使得我最开始的时候登录了还没看到效果。后来在怀疑是需要配置认证机制。接着这里使用了一个Provider,AspNetSqlPersonalizationProvider并非类名,只是SqlPersonalizationProvider配置的名称而已。默认配置如下,

在ASP.NET中实现了这个个性化提供者的就只有这个SqlPersonalizationProvider,这个我是看源码还有MSDN中类的继承结构中看出来的。不知有无其他地方明确指出,如需要其他的提供机制,则需要自定义扩展了。

您可以从其中 PersonalizationProvider ,并提供仅在此类中定义的抽象方法的实现。 抽象方法处理专门与保存和加载数据写入物理数据存储,以及数据存储区管理。 自定义提供程序必须能够处理可区分的方式的个性化信息 Shared 中的数据 User 数据。 此外,提供程序必须段个性化数据页以及按应用程序。

实现 PersonalizationProvider 紧密耦合的实现与 PersonalizationState 由于某些个性化设置提供程序方法返回的实例 PersonalizationState的派生类。 为了便于开发自定义提供程序, PersonalizationProvider 基类包括个性化设置逻辑和序列化/反序列化逻辑,直接使用的默认实现WebPartPersonalization 类。 结果是,创作专门用于使用不同的数据存储区的自定义提供只需要下列抽象方法的实现︰

  • GetCountOfState -此方法需要能够在数据库中为提供的查询参数的个性化数据行的数目进行计数。
  • LoadPersonalizationBlobs -在给定路径和用户名的情况下,此方法从数据库中加载两个二进制大型对象 (Blob): 一个用于共享的数据,另一个用于用户数据的 BLOB。 如果您提供的用户名称和路径,则不需要 WebPartManager 控件,用于访问可以提供的用户文件名/路径信息的页信息。
  • ResetPersonalizationBlob -在给定路径和用户名的情况下,此方法中删除数据库中相应的行。 如果您提供的用户名称和路径,则不需要WebPartManager 控件,用于访问可以提供的用户文件名/路径信息的页信息。
  • SavePersonalizationBlob --此方法在给定的路径和用户名称,保存对数据库所提供的 BLOB。 如果您提供的用户名称和路径,则不需要 WebPartManager 控件,用于访问可以提供的用户文件名/路径信息的页信息。

在所有这些方法中,如果只提供一个路径,则表示正在操作页上的共享的个性化设置数据。 如果用户名和路径传递到方法中,页上的用户个性化设置数据应得到处理。 情况下 LoadPersonalizationBlobs, ,应始终加载指定的路径的共享的数据,并 (可选) 的路径的用户个性化设置数据也如果应加载的用户名不是 null

所有抽象方法旨在仅用于管理应用程序,在运行时不使用由 Web 部件基础结构。 个性化设置提供程序的实现的示例,请参阅SqlPersonalizationProvider 类。

说了这么多看看这个示例的运行效果

经过登录之后就可以看到界面如上所示,点击Change xxx Color就可以改变方块的颜色,这些颜色设置是存储到数据库的,用户可以在注销下次登录时扔看到这些设置,包括对面板的关闭和最小化操作。下面的面板是控制这些设置的作用域,一个是用户个人的,一个是全局共享的。可以通过Change Scope去切换。这里涉及到两个方面内容,首先是数据保存,数据存储在Web程序默认建立的SqlServer数据库中,与MemberShip的库相同。个人数据的放在PersonalizationAllUsers里面,Share的则放在PersonalizationPerUser中。所有的数据都并非直接存放在表中,作为通用存储的话这是不可能的。

另外关于权限控制的,在配置文件中的personalization/authorization配置节跟system.web/authorization的结构很相像,区别在于verbs,这里用的值仅以下两种。

对于获取设置信息是不阻拦的,但是需要更换作用域进入共享区时需要有enterSharedScope权限,当需要更改任何一个作用域的数据时需要modeifyState。如果两个权限都被deny的话,用户就只能傻傻地看了

personalization的结束到此完,接下来到transformers。这里涉及到一个web部件连接的概念。不知我自己有否理解错,这个web部件连接的双方中提供数据的一方个人感觉就是一个数据源。数据源提供的数据可以给页面上其他多个控件使用,但是数据源提供的数据格式不一定符合其他所有控件,因此这里就需要一个转换器来适配双方的差异,这就是适配器模式嘛!吗?但是要是说多弄一个数据源(或者叫Provider)的话,这样的开销比较大。那么ASP.NET提供的转换器就只有两个RowToFieldTransformer和RowToParametersTransformer,如果需要其他的转换就需要自己定义,还需要到配置文件中声明一下这个转换器,下面也是借鉴了一个MSDN的例子来尝试一下通过一个行转换到字符串。

对于MSDN的例子我还是精简了两个控件,大概可以看以下这里建立了一个静态的Web部件连接,通过一个rowtostringtransformer进行转换。这个链接的提供者是rowproviderwebpart的自定义webPart,另一个stringconsumerwebpart的自定义webpart。这些类都定义在App_Code文件夹中,所以注册命名空间的时候要注意一下

下面就是各个文件的代码IString

RowToStringTransformer

下面这两个类是参考了MSDN的代码,自己根据当前的情况改过一下,不然运行不了,但不知道有否改错,使之背离愿意

    // This sample code creates a Web Parts control that acts as a provider // of row data.
    [AspNetHostingPermission(SecurityAction.Demand,Level = AspNetHostingPermissionLevel.Minimal)][AspNetHostingPermission(SecurityAction.InheritanceDemand,Level = AspNetHostingPermissionLevel.Minimal)]public sealed class RowProviderWebPart : WebPart, IWebPartRow{private DataTable _table;public RowProviderWebPart(){_table = new DataTable();DataColumn col = new DataColumn();col.DataType = typeof(string);col.ColumnName = "Name";_table.Columns.Add(col);col = new DataColumn();col.DataType = typeof(string);col.ColumnName = "Address";_table.Columns.Add(col);col = new DataColumn();col.DataType = typeof(int);col.ColumnName = "ZIP Code";_table.Columns.Add(col);DataRow row = _table.NewRow();row["Name"] = "John Q. Public";row["Address"] = "123 Main Street";row["ZIP Code"] = 98000;_table.Rows.Add(row);}[ConnectionProvider("String123")]public IWebPartRow GetConnection(){return new RowProviderWebPart();}public PropertyDescriptorCollection Schema{get{return TypeDescriptor.GetProperties(_table.DefaultView[0]);}}public void GetRowData(RowCallback callback){foreach (var item in _table.DefaultView){callback(item);}}} [AspNetHostingPermission(SecurityAction.Demand,Level = AspNetHostingPermissionLevel.Minimal)][AspNetHostingPermission(SecurityAction.InheritanceDemand,Level = AspNetHostingPermissionLevel.Minimal)]public sealed class StringConsumerWebpart : WebPart{private IString _provider;private string _stringData;private void GetRowData(object rowData){_stringData = rowData.ToString();}protected override void OnPreRender(EventArgs e){if (_provider != null){_provider.GetStringValue(new StringCallback(GetRowData));}}protected override void RenderContents(HtmlTextWriter writer){if (!string.IsNullOrEmpty(_stringData)){writer.Write(_stringData);writer.WriteBreak();writer.WriteLine();}else{writer.Write("No data");}}[ConnectionConsumer("String123")]public void SetConnection(IString provider){_provider = provider;}}

在调试的时候发现_provider.GetStringValue(new StringCallback(GetRowData));这行代码最绕,嵌了几个委托;另外有个有意思的地方就是get/set连接的时候,它使用了一个类似依赖注入的东西,Attribute的Display参数把Connection的get/set两个方法配对,完全忽略方法的命名,可惜这个ConnectionConsumer和ConnectionProvider只能描述方法,不然可以用到属性去。

差点忘了把Web.config的配置添加进去

最终结果如下图,就把Provider中的一个table的专成了一个字符串。

参考文章

Visual Studio 中的 ASP.NET Web 部件

来自 <https://msdn.microsoft.com/zh-cn/library/0ey99zzh(v=vs.80).aspx>

ASP.NET Web 部件概述

来自 <https://msdn.microsoft.com/zh-cn/library/hhy9ewf1(v=vs.100).aspx>

Web 部件控件集概述

来自 <https://msdn.microsoft.com/zh-cn/library/k3w2y2tf(v=vs.100).aspx>

Web 部件个性化设置概述

来自 <https://msdn.microsoft.com/zh-cn/library/z36h8be9(v=vs.100).aspx>

webParts 元素(ASP.NET 设置架构)

来自 <https://msdn.microsoft.com/zh-cn/library/ms164680(v=vs.110).aspx>

WebPartPersonalization 类(Personlization设置实现)

来自 <https://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.webparts.webpartpersonalization(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-4>

WebPartTransformer 类(transformers设置实现)

来自 <https://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.webparts.webparttransformer(v=vs.110).aspx>

如何:声明两个 Web 部件控件之间的静态连接

来自 <https://msdn.microsoft.com/zh-cn/library/ms178188(v=vs.100).aspx>

IWebPartRow 接口

来自 <https://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.webparts.iwebpartrow(v=vs.100).aspx>

webParts与Web部件相关推荐

  1. 关于ASP.NET Web 部件连接的引入

    创建用于 ASP.NET 2.0 应用程序的 Web 部件 您可以用两种方法创建 Web 部件.第一种方法涉及创建一个自定义的 Web 部件类,该类从 System.Web.UI.WebControl ...

  2. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)

    Web部件目录 我们已经见过了如何在 WebPartZones 控件中事先放入Web部件.你还可以用另外一种方法完成这个功能,那就是允许用户在运行时添加新的Web部件.通过使用 CatalogZone ...

  3. 学习 ---AJAX如何用于Web部件

    原文地址:http://sharethispoint.com/archive/2006/11/15/Build-web-parts-with-ajax.aspx 如何在开发Web部件时使用ajax呢? ...

  4. 开发高级 Web 部件

    通过用户控件实现 Web 部件相当容易,但是也有一些弊端: 受限的重用:如果不手动复制 .ascx 文件到其他 Web 应用程序的目录下,就不能动态添加这些控件到其他 Web 应用程序的页面中. 受限 ...

  5. SharePoint 2010开发实例精选——通过客户端对象模型删除页面上的Web部件

    下面的例子是在控制台应用程序中使用客户端对象模型,为了在控制台程序中使用ClientContext,我们需要添加两个dll引用到我们的项目中.Microsoft.SharePoint.Client.d ...

  6. SharePoint 2010 名言警句 Web部件

    SharePoint 2010 名言警句 Web部件 使用这个Web部件,每天你在页面上都可以看到名言警句. 这个 Web部件可用于波斯语和英语,以后也可能添加其他语言. 安装向导 在PowerShe ...

  7. 创建 Web 部件页--msdn

    本演练中的演示让您亲身体验用于创建使用 Web 部件控件的网页的基本组件和任务. 在许多 Web 应用程序中,可以更改内容的外观并允许用户选择和排列他们想要看到的内容,这一点十分有用.ASP.NET ...

  8. SharePoint 2010 内容编辑器Web部件的使用方法

    内容编辑器Web部件一直是SharePoint Server产品中一个可以免费使用的部件,使用这个Web部件可以用来显示格式化的文本内容,这些格式化的文本内容可以是HTML代码或JavaScript代 ...

  9. 保护 ASP.NET Web 部件页面

    Web 部件是 ASP.NET 的一个新特征,它提供给终端用户对 Web 页面进行更改或个性化的能力.拥有已个性化的 Web 页面是非常强大的 Web 应用程序,但是它同样有需要被开发者所了解的安全隐 ...

最新文章

  1. 自学python还是报班-学习Python报培训班真的有必要吗?
  2. 去除字符串标点 + 泛型算法使用
  3. WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现...
  4. php环境搭建sqlserver,ThinkPHP5.0/5.1对接SQLServer数据库(宝塔环境)
  5. Download Apache Commons BeanUtils
  6. hls二次加密 m3u8_将视频转换为m3u8,使用AES-128的方式加密HLS真的有效吗?
  7. [Ajax] jQuery中的Ajax -- 01-jQuery中的Ajax
  8. 使用EasyPoi轻松导入导出Excel文档
  9. 大数据_MapperReduce_协处理器_类似Mysql的触发器---Hbase工作笔记0024
  10. python祝福祖国代码_C语言-笔记一
  11. python数据科学课后答案_Python数据科学-技术详解与商业实践-第五讲作业
  12. css两张图片怎么合在一起_PhotoShop怎么把两张图片合成一张?怎么用ps把两张图片合成一张?...
  13. java 分享商品生成海报到微信+二维码
  14. JSON.stringify方法详解
  15. 不能为属性:[commandName]找到setter 方法
  16. 小型超市网上购物系统开发项目总结
  17. VCIP2020:基于深度学习合成参考帧
  18. 老王的JAVA基础课:序言
  19. php图片上传保留第一帧,七牛云上传视频怎么截取第一帧为图片
  20. 盘点2021款iPad Pro 5个增强功能,与上一代有什么区别?

热门文章

  1. 02-C#入门(循环)
  2. 在apache访问日志中统计统计前十名pv
  3. 高级软件工程师的职责范围
  4. iis6扩展php_Web服务器IIS6的PHP5.2.5最佳配置方法
  5. SpringSecurity用数据库信息做认证
  6. redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
  7. Netty 总结与面试答疑
  8. Spring框架中的SpringFactoriesLoader
  9. Java的Excel导出方案介绍
  10. aop简介-aop的底层实现