博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webParts与Web部件
阅读量:6440 次
发布时间:2019-06-23

本文共 7248 字,大约阅读时间需要 24 分钟。

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#" %>    WebParts Personalization Example

 

 

   

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

 

1 <%@ control language="C#" %>  2   3  70 
71  
76
 
81 82 83
88
93
94
User cannot enter Shared scope
96
97
102
103
105
106
 
109
110
112
113
115    116

 

 

 

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

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

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

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

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

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

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

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

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

经过登录之后就可以看到界面如上所示,点击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两个方法配对,完全忽略方法的命名,可惜这个ConnectionConsumerConnectionProvider只能描述方法,不然可以用到属性去

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

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

   

参考文章

   

Visual Studio 中的 ASP.NET Web 部件

来自 <>

   

ASP.NET Web 部件概述

来自 <>

   

Web 部件控件集概述

来自 <>

   

Web 部件个性化设置概述

来自 <>

   

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

来自 <>

   

WebPartPersonalization 类(Personlization设置实现)

来自 <>

   

WebPartTransformer 类(transformers设置实现)

来自 <>

   

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

来自 <>

   

IWebPartRow 接口

来自 <>

   

   

转载地址:http://sazwo.baihongyu.com/

你可能感兴趣的文章
彻底理解ThreadLocal
查看>>
Node.js~ioredis处理耗时请求时连接数瀑增
查看>>
企业如何走出自己的CRM非常之道?
查看>>
整合看点: DellEMC的HCI市场如何来看?
查看>>
联合国隐私监督机构:大规模信息监控并非行之有效
查看>>
韩国研制出世界最薄光伏电池:厚度仅为人类头发直径百分之一
查看>>
惠普再“卖身”,软件业务卖给了这家鼻祖级公司
查看>>
软件定义存储的定制化怎么走?
查看>>
“上升”华为碰撞“下降”联想
查看>>
如何基于Spark进行用户画像?
查看>>
光伏发电对系统冲击大 “十三五”电力规划重点增强调峰能力
查看>>
全球19家值得关注的物联网安全初创企业
查看>>
Android下的junit 单元测试
查看>>
这几个在搞低功耗广域网的,才是物联网的黑马
查看>>
主流or消亡?2016年大数据发展将何去何从
查看>>
《大数据分析原理与实践》一一第3章 关联分析模型
查看>>
《挖掘管理价值:企业软件项目管理实战》一2.4 软件设计过程
查看>>
Capybara 2.14.1 发布,Web 应用验收测试框架
查看>>
ExcelJS —— Node 的 Excel 读写扩展模块2
查看>>
《数字短片创作(修订版)》——第一部分 剧本创作 第1章 数字短片创意技法 剧本创作的构思...
查看>>