0

我最近继承了一个大型 .NET 项目,需要在其中修补角色实现。不同的角色对站点有不同的访问权限,一些元素需要根据当前用户的角色相应地隐藏。

考虑到某种灵活和模块化的架构,当用户尝试访问他们无法访问的站点部分时,这很容易实现。但是,在验证控件的可见性时遇到了问题。

许多控件是通过自己的项目特定控件实现的,但是链接大多是通过 HtmlAnchors 实现的,其他一些属于受限类别的字段也是通用的 html 元素。

有没有办法可以用通用适配器修补它,或者我是否必须翻阅项目中存在的大量控件和元素,并使它们继承一个可以单独实现的通用基础?在这种情况下,体力劳动意味着大量工作,我不确定这最终是否是正确的方法。

基本上,有没有办法让页面的所有控件和元素运行检查它们是否应该在 .NET 4.0 Web 项目中呈现可见?我能否设法修补它,以便所有元素都有能力接受和处理描述其“限制级别”的新属性?

4

1 回答 1

0

是的,你可以做那种事情。想到了两个 ASP.NET 功能,它们可能对您有所帮助:

  1. ASP.NET 标记映射。此功能允许您在解析器找到特定 ASP.NET 标记时更改实例化对象的类型(例如,您可以将所有 HtmlAnchors 替换为继承自您选择的某个基类的 SpecialHtmlAnchors)。您只需要在 web.config 的 /system.web/pages/ 下添加一个 tagMapping 部分。(我没有测试过这个样本,但它应该接近正确。无论如何,这是一个起点。)

    <system.web>
      <pages>
        <tagMapping>
          <add tagType="System.Web.UI.HtmlControls.HtmlAnchor, System.Web"
             mappedTagType="My.Special.HtmlAnchor, MyAssembly"/>
        </tagMapping>
      </pages>
    </system.web>
    
  2. ASP.NET 控制适配器。您可以告诉 ASP.NET 将输出适配器附加到特定类型的每个实例化控件。该功能最初旨在促进特定浏览器或浏览器类型(例如桌面与移动)的输出适应,但您几乎可以对它们做任何您想做的事情。要使用它们,您在文件夹中创建一个.browsers文件App_Browsers(如果它不存在,请在 VS 中右键单击您的 Web 项目,将鼠标悬停在“添加 ASP.NET 文件夹”并选择并选择“App_Browsers”。然后,添加您的.browsers文件通过“添加新项目...”对话框到此文件夹。通过将文件修改为如下所示来注册您的自定义控件适配器.browsers

    <browsers>
        <browser refID="Default"> <!-- all browsers -->
            <controlAdapters>
                <adapter controlType="System.Web.UI.HtmlControls.HtmlAnchor"
                    adapterType="My.Custom.RolesAwareControlAdapter, MyAssembly" />
            </controlAdapters>
        </browser>
    </browsers>
    

    控件适配器继承自System.Web.UI.Adapters.ControlAdapter,它具有与普通控件几乎所有相同的呈现方法。ControlAdapter 完全控制控件的呈现,但如果需要,可以将呈现委托回 Target 控件。

关于向控件添加新属性:如果您已经要检查现有代码并添加属性,为什么不直接更改标记类型以引用自定义控件呢?自定义控件的公共属性会自动提升为标记属性,以便您可以在设计时指定它们的值。

另一种好的 WebForms 方法——尽管它不会解决编辑数百个页面和用户控件的乏味问题——是使用LoginView,因为它旨在解决像您这样的问题。

如果您有任何问题,请告诉我;我很乐意澄清。

于 2013-07-09T17:59:20.910 回答