反射和 ASP.NET 网页控件

分享于 

9分钟阅读

Web开发

  繁體

介绍

有时候,年轻开发人员完全理解反射API的功能,以及如何在它的ASP.NET 应用程序中使用它是不容易的。 方法非常困难,文档非常技术,因这里人们更喜欢编写大量代码,而不是实现可以重用的特性。 在本文中,我共享一个可以用于动态更改 ASP.NET 管理属性的实用工具,并显示如何使用简单网站。

方案

为什么要动态更改控件的属性? 原因可能是无尽的。

  • 某些小型应用程序可能无法按角色实现安全性。 假设对于企业问题,如果用户的角色不正确,则需要保护应用程序的某些特性。 快速解决方案可以禁用执行要保护的函数的控件的( 按钮,链接,等等 )。 反射这个目标的一种简单方法。

  • 有时你需要根据用户的选择将属性更改为用户控件(。像标签文本或者颜色)。 反射可以帮助你。

  • UserControl的文本框不能在某些页中使用,但可以在其他页中使用。 使用反射使文本框消失,而不需要数百个"中频"条件。

这些只是几个例子。 现在让我们进入代码。

使用代码

附加的示例完全由实用程序ReflectionComponent管理。 我将解释最完整的情况。 查看代码将很容易看到工具的其他特性。 下载代码并以" Default2.aspx"作为起始页运行它。 单击"如何使用示例"获取帮助。

这个应用程序使用几个规则来改变" enabled"的属性。

在页面中,你将看到四个区域,(。MasterPageFieldSetFirstUserControlSecondUserControl ) 代表容器控件。 在"选择模板"中选择一个或者多个将启用预分类"按角色启用"和"按控件启用"。 这些表示一组规则,你可以应用这些规则来启用你选择的区域。 你可以:

  • 通过控制启用 : 如果选择了选择的容器控件中的"按钮"复选框,将会看到"按钮"将被启用并且标签( 在右边) TextForeColor 将被更改。

  • 按角色启用 如果从dropdownlist选择"运算符",你将看到只有选定的容器控件中的某些控件将被启用。 这取决于在控件中插入的自定义属性的值。

通过管理方法,你可以在 App_Code 文件夹中使用你通过的参数对象来获取这个目标。 ManagedControls.ChangeControlsAttributeValues 被调用,让我们看看:

在选择区域之后,在"按角色启用"中选择"运算符"。 注意,控件容器中的每个控件都包含一个名为 Security的自定义属性。 在这里示例中,在控件中,当" Security"的值包含" Operator"时,属性" Enable"将设置为" true"。

<asp:ButtonID="btnOne"runat="server"Security="Administrator;Operator;Other"Text="Button"Enabled="False"OnClientClick="javascript:return false;"/><asp:LabelID="lblBtnOne"runat="server"Text="(Disabled)"ForeColor="Red"></asp:Label><br/><br/><asp:CheckBoxID="chkOne"runat="server"Security="Administrator;Operator"Text="CheckBox"Enabled="False"/><asp:LabelID="lblChkOne"runat="server"Text="(Disabled)"ForeColor="red"></asp:Label><br/><br/><asp:TextBoxID="txtOne"runat="server"Security="Administrator"Enabled="False"></asp:TextBox><asp:LabelID="lblTxtOne"runat="server"Text="(Disabled)"ForeColor="red"></asp:Label><br/><br/>

要获得这个目标,你需要调用 static 方法 ManagedControls.ChangeControlsAttributeValues 具有正确参数的实用程序。 查看 ddlUserRoles_SelectedIndexChanged 方法中的代码。

_managedControlParameter = new ManagedControlParameter();//Set container controlif (chklTemplate.Items[0].Selected)
 _managedControlParameter.MainControls.Add(Master);if (chklTemplate.Items[1].Selected)
 _managedControlParameter.MainControls.Add(rightFieldset);if (chklTemplate.Items[2].Selected)
 _managedControlParameter.MainControls.Add(firstUserControl);if (chklTemplate.Items[3].Selected)
 _managedControlParameter.MainControls.Add(secondUserControl);//Set type of control you want change property _managedControlParameter.ManagedControls.Add(ManagedControlType.All);//Set property you want change if custom attribute (Security) is setting to correct value_managedControlParameter.Attributes.Add(new ManagedControlTypeAttributesValue
 {
 Attribute = "Enabled",
 AttributeNewValue = "true",
 CustomAttribute = "Security",
 CustomAttributeValue = ddlUserRoles.SelectedValue
 });//CallManagedControls.ChangeControlsAttributesValues(_managedControlParameter);

ManagedControlParameter 表示反射实用工具接收到的一组参数以执行所需的操作。 检查它:

  • MainControls属性表示要管理的容器中的控件列表。 但是,如果需要管理单个项目,则只能添加一个 webcontrol。 ( 请参见 Page_Prerender 中的代码以获得单个 asp:label

  • ManagedControls属性是要应用新属性的坐标表。 这些是在 ManagedControlType enum 中定义的。 enum 项必须与 name(GetType().Name)的相同。 在本例中,你需要应用所有控件的更改。

  • 属性属性包含在定义( 如果不检查它的情况下) 定义( CustomAttributeCustomAttributeValue )的对象集合。

    • Attribute: 你想更改
    • AttributeNewValue: 新值( 注意类型)
    • CustomAttribute: 要检查的属性
    • CustomeAttributeValue: 要测试的值

接下来,调用 ManagedControls.ChangeControlsAttributeValues 鏂规碜。

"ReflectionComponent"实用程序

ChangeControlsAttributeValues 方法检查对象参数并重组输入,以便提供易用性( CheckParameters )。 之后,它将检索将应用( GetManagedWebControls )的控件的列表。 查看注释以了解获取控件列表的规则。

ApplyChange 方法开始处理控件列表。 接下来,对于每个控件,尝试应用要设置的新属性值。 使用反射方法获取需要修改的属性的引用,并检查是否可能。

.... //Get attributes control to change var controlAttribute = control.GetType().GetProperty(attribute.Attribute);
....

设置 CustomAttribute 时,该方法将搜索 webcontrol ( 使用 GetControlCustomAttributes ) 中的属性并检查它的值。 如果确定,controlProperty.SetValue 将被用来设置新值。 要注意新的价值。 必须可以进行强制转换。

....//(Be carfull about contains when you define your custom attribute value)if (GetControlCustomAttributes(control)[attribute.CustomAttribute]!= null &&
 (GetControlCustomAttributes(control)[attribute.CustomAttribute]).Contains(
 attribute.CustomAttributeValue))
 //Change with CAST  controlAttribute.SetValue(control,
 Convert.ChangeType(attribute.AttributeNewValue,
 controlAttribute.PropertyType),
 null);
....

结束语

反射是一个非常强大的特性。 本文只是一个小示例,演示如何提高应用程序的灵活性并快速解决一些问题。 请给我反馈,并抱歉我的英语。

文章更新日志

  • 19 2013年03月: 文章代码示例与实用代码的对齐。
  • 15 2013年03月: 初始版本。

WEB  控制  asp  asp-net  REF  Controls  
相关文章