ASP.NET PropertyGrid用户网页控件

分享于 

9分钟阅读

Web开发

  繁體

介绍

ASP.NET 缺少基于web的属性网格控件,它允许直接修改对象以支持它的组件模型属性。 第三方或者开源贡献似乎太笨拙或者只是实现不好。 开发一个自定义框架时,我发现自己需要设计一些操纵业务对象的ASP.NET 网页。 在这些页面上,我没有足够的时间手工手工创建这些页面,所以我选择花几个小时来编写基于web的属性网格类用户控件。 我主要希望用户控件动态查询单个对象,构建读取和操作类的public 属性所需的必要的HTML输入标记。 这个控制不完善,有足够的空间来改进。

详情

首先,首先:这个用户如何控制网页的开发速度? 通常,构建网页收集用户输入并将这里输入应用到后台数据库是非常耗时的。 标签,各种输入控件,格式,条件显示或者读/写行为,等等。 一些时间可能会影响很多页面,或者在某些悲伤的情况下,可能会堵塞到一个过于复杂的网页。 为了从数据库中读取数据。向新数据推送或者更新现有数据,我们通常需要大量繁琐的工作。 此外,如果对象发生更改,则调用该对象的网页也必须更改。 我坚实保持数据库select语句并将过程调用存储在用户界面标记中,而使用中间层( 业务对象) 处理数据库活动。 Object网络编辑器能够查询被调用的类,读取组件模型属性,呈现属性名称,以及为对象提供最合适的输入用户控件,以及将数据收集到对象,以便进一步进行处理。 这大大减少了允许网页快速实现所需的HTML表单工作量。 此外,用户控件页面的令人愉快的副作用是一致实现的。

of System.ComponentModel 命名空间提供了对象元数据将包含设计时/运行时"规则"的方式。 对象Web编辑器的核心是能够递归反映对象实例的读取,并根据属性设计器属性提供适当的访问。

让我们看看这个用户控件如何在网页上使用,以及在加载页面时它做什么。 below 是一个简单网页的屏幕截图,它在代码后面调用一个 Person 类。

这里我们看到了由对象Web编辑器和左边呈现的动态创建的HTML以及右边 ASP.NET 网页的设计时视图。 我选择不花大量时间在这个用户控件的设计时间呈现和编辑。 网页在它的标记中定义以下内容。

<owe:ObjectWebEditorid="personEditor"runat="server"ViewStateMode="Enabled"HiddenProperties="Exceptions"><owe:PropertyMapPropertyName="HomePage"LinkDescription="My Home Page"URL="MyHomePage.aspx?SSN={SSN}"ToolTip="Visit my Home Page"/></owe:ObjectWebEditor>

我将覆盖这里自定义用户控件的not-so-obvious属性。

HiddenProperties - 这里字符串包含一个不希望显示的对象属性的分隔列表。 "显示",动态生成HTML以允许查看并可能编辑这些属性。 在示例 上面 中,我排除了底层 Person 类的Exceptions 属性。 在 ObjectWebEditor 用户控件中定义的是子控件,这些控件提供对某些属性的自定义处理。 在示例 below 中,我选择交换与 Person 类的" HomePage"属性相关的通常呈现的HTML,并带有名称为"我的主页"的超链接。

Default.aspx 调用 Person 类的实例,并且 ObjectWebEditor 用户控件的SelectedObject 属性设置为该实例。 在页面加载时,ObjectWebEditor 查询 Person 对象以呈现显示它的属性所必需的HTML。 编辑器honors组件模型属性( 如 ReadOnly ),并且只为它的public 成员生成 HTML。

类属性的Category 属性用作节标题。 这些恰好按照对象询问过程中遇到的顺序呈现。

可以通过在 ObjectWebEditorHiddenCategories 属性中定义类别名称,将整个类别与属性类似地隐藏起来。

注意 below的几个输入字段是灰色的。 这是因为这些属性在活动类级别标记为只读。 这并不意味着不能以编程方式改变它们。

对象Web编辑器用户控件自动生成HTML标记和 on-the-fly。 每个HTML输入字段都以这种方式命名,对象Web编辑器用户控件可以确定在发出后应用的值。 包含 Description 属性HTML标记的table 行显示为 below。

<trclass="PropertyGridPropertyRow"align="left"><tdclass="PropertyGridPropertyName"valign="top"align="left"width="100%">Age</td><tdclass="PropertyGridPropertyValue"valign="top"align="left"width="100%"><inputid="personEditor_2"name="personEditor_2"type="Text"value="52"></td></tr>

每个HTML输入字段名组合了对象Web编辑器控件的名称加上所表示的属性的计数。 这保证每个HTML输入字段都是惟一的,无论在给定页面上的这些控件的数量是多少。

回发 ObjectWebEditor 访问请求表单字段 Collection 并将文件名与它的内部表域名称的内部映射匹配到所选对象类属性。 它应该能够做到这一点。 毕竟,它在第一个地方创建了这些字段;

某些类可能将其他类的实例包含为 public 属性。 ObjectWedEditor 通过调用一个新实例并将它的附加到属性来处理它。effective有效成为它的编辑器。 在这种情况下,新用户控件实例的ClientID通过将其父"编辑器"的ClientID与""组合在一起,从而使"编辑器 X"在这个例子中产生了。 如果假设的子类有另一个子类,也会再次导致"editorx镑X"等等。

有些情况下,可能希望隐藏on-the-fly为一个或者多个属性生成的HTML标记。 这是通过对象网络编辑器用户控件的HiddenProperies 属性实现的。

HiddenProperties="Exceptions,ActivityStatus,ActivityType,Prerequisites"

类类别的true 也相同。

HiddenCategories="System"

在某些情况下,给定属性的实际名称不适合用户界面显示。 在示例 below 中,我们使用嵌套的PropertyMap 定义将"姓氏"显示的标签更改为"人员姓氏"。

为了使其他动态运行时行为发生,JavaScript可以放在 PropertyMap 定义的URL属性中。

PropertyMap 控件还可以用所选对象的命名属性值替换已经标记的值。 这里我们看到 Person.SSN 被应用到一个 url。

每个对象Web编辑器用户控件生成的HTML table 元素都可以按如下方式进行样式化:

.PropertyGrid{
}
.PropertyNestedGrid{
}
.PropertyGridCategory{
 white-space: nowrap;}
.PropertyGridCategoryName{
 white-space: nowrap;font-weight: bold;}
.PropertyGridPropertyRow{
 white-space: nowrap;}
.PropertyGridPropertyName{
 white-space: nowrap;}
.PropertyGridPropertyValue{
 white-space: nowrap;}
.PropertyGridPropertyLink{
 white-space: nowrap;}

对于我来说,ObjectWebEditor 用户控件通过提供动态生成的表示和数据收集HTML大大缩短了 ASP.NET 网页开发。 使用这个控件,我能够在大约一半的时间内将业务对象包装为 20个网页。 此外,这些页面在ASP标记和后面的代码中看起来非常一致。

历史记录

  • 1/2/2012: 初始版本。

WEB  控制  USE  asp  asp-net  用户  
相关文章