Skip to content

SAIF.Presentation.Web.Controls.AJAX.Infragistics111 architecture

SAIF.Presentation.Web.Controls.AJAX.Infragistics111 is a WebForms server-control library that layers AJAX Control Toolkit and Infragistics 11.1 behavior onto the SAIF presentation stack. It provides three capability groups: auto-binding editors that bind themselves to a page model by reflection and surface IDataErrorInfo validation messages; hover help controls built on the toolkit's HoverMenuExtender, optionally fed from the APPLICATION_HELP_* tables through two BOF business objects; and an Infragistics grid customizer that lets a user choose visible grid columns and page size in a modal popup and persist those choices as user preferences.

Responsibilities

  • Provide reflection-based, two-way, convention-driven data binding between page controls and a hosting page's Model property, including validation surfaced through the bound object's IDataErrorInfo.
  • Provide hover-help UI (HoverPanel, HoverLabel, HoverPicture, HoverHelp, HoverHelpControl) built on the AJAX Control Toolkit's HoverMenuExtender, optionally backed by the clsHelpText/clsHelpTextCollection BOF business objects.
  • Let a user customize an UltraWebGrid's visible columns and page size in a modal popup, and persist those choices as per-user preferences (InfragisticsGridCustomizer).
  • Sit at the top of the intra-package presentation dependency chain, composing SAIF.Presentation.Web.Controls.Infragistics111 and SAIF.Presentation.Web.Binding.Infragistics111.

Component boundaries

  • SAIFAJAXControlAncestor (extends System.Web.UI.WebControls.CompositeControl): root ancestor for every control in this library; exposes the page's Model as RootObject and a browser-detection helper.
  • AutoBindControlAncestor (implements iAutoBindingControl) and its concrete editors AutoBindTextbox, AutoBindWebMaskEdit, AutoBindWebDateTimeEdit: reflection-based two-way binding, validation, and error display, each wrapped in an Infragistics WARP inside a hover-trigger panel.
  • BindingManager: page-level orchestrator that pushes the root model into every iAutoBindingControl on the page and aggregates IsValid/ErrorMessages.
  • BindingUtility: shared reflection/TypeDescriptor-based helper (GetObject, GetObjectValue, SetObjectValue, BindValue) used by the auto-binding controls.
  • Hover-help family (HoverPanel, HoverPanelControl, HoverLabel, HoverPicture, HoverHelp, HoverHelpControl): presentation-only, independent of the binding sub-system except for a shared ancestor.
  • Grid customization family (ModalGridCustomizer, GridCustomizationPanel (Friend), InfragisticsGridCustomizer, InfragisticsGridCustomizerList, HidableInfragisticsColumn, ColumnPreferenceList): a self-contained popup-based column/page-size editor for UltraWebGrid that persists state through clsPreferences.
  • clsHelpText / clsHelpTextCollection (BOF business objects, inherit clsBusinessBase / clsBusinessCollectionBase): read-only help text lookup by application code and reference key, backing the hover-help controls.

Interaction model

  • Every control expects the hosting page to expose a property named Model; BindingManager.RootObjectName is publicly settable but the private GetRootObject hard-codes "Model", so the setting is not honored.*
  • Binding paths are dotted strings (BindSource, e.g. Submission.Locations.Primary) walked by BindingUtility.GetObject via reflection/TypeDescriptor, with no compile-time checking; BindingUtility swallows all exceptions, so a mistyped path fails silently.*
  • Validation reuses the bound object's IDataErrorInfo implementation; error text is split on CRLF into individual messages and rendered without HTML encoding.*
  • ModalGridCustomizer composes GridCustomizationPanel (the modal popup body) with InfragisticsGridCustomizer (per-grid column/page-size state) and, depending on BindingBehavior, rebinds the grid through SAIF.Presentation.Web.Binding.Infragistics111's clsObjectBindManager — a second, parallel binding mechanism alongside this library's own reflection-based binding.*
  • Per-page grid-customizer instances are cached in an InfragisticsGridCustomizerList held on the model under GridCustomizers, keyed by grid ID, so column state survives postbacks for the life of the model.*
  • Column and page-size preferences are read/written via clsPreferences obtained by reflection from the model's Preferences property, using composite keys IGC_<gridId>_ColumnSelection and IGC_<gridId>_PageSize.

Architecture diagram

The following diagram shows the three cooperating sub-systems that share one ancestor but are otherwise independent.

flowchart TD
    ANC["SAIFAJAXControlAncestor<br>CompositeControl"] --> ABA["AutoBindControlAncestor<br>iAutoBindingControl"]
    ANC --> HP["HoverPanel / HoverPanelControl"]
    ANC --> HL["HoverLabel / HoverPicture / HoverHelpControl"]
    ANC --> GCP["GridCustomizationPanel (Friend)"]
    ANC --> MGC["ModalGridCustomizer"]
    ABA --> ABT["AutoBindTextbox"]
    ABA --> ABM["AutoBindWebMaskEdit"]
    ABA --> ABD["AutoBindWebDateTimeEdit"]
    HP --> HH["HoverHelp"]
    HL --> HH
    HH --> HT["clsHelpText / clsHelpTextCollection<br>clsBusinessBase"]
    MGC --> GCP
    MGC --> IGC["InfragisticsGridCustomizer<br>+ HidableInfragisticsColumn<br>+ ColumnPreferenceList"]
    BM["BindingManager"] --> ABA
    ABA --> BU["BindingUtility (reflection)"]
    IGC --> PREF["clsPreferences<br>SAIF.Framework.Preferences"]

Sequence diagram

The following diagram shows a user customizing grid columns through the modal popup and the resulting preference persistence.

sequenceDiagram
    participant User
    participant MGC as ModalGridCustomizer
    participant GCP as GridCustomizationPanel
    participant IGC as InfragisticsGridCustomizer
    participant Pref as clsPreferences
    participant Grid as UltraWebGrid
    User->>MGC: Open customizer (ModalPopupExtender)
    MGC->>GCP: Render column checkbox list
    User->>GCP: Toggle columns, click OK/Apply
    GCP->>IGC: Update(selected columns, page size)
    IGC->>Pref: SavePreferences (IGC_<gridId>_ColumnSelection / PageSize)
    IGC->>Grid: ManipulateGrid - remove deselected columns
    Grid-->>User: Updated grid rendering

Design constraints

  • Option Strict is Off at the project level (a few files opt in to Option Strict On), permitting late binding across most of the library.*
  • The binding mechanism in this library is separate from and parallel to SAIF.Presentation.Web.Binding.Infragistics111's clsObjectBindManager, which it also consumes for grid rebinding — two independent binding mechanisms coexist in the presentation stack.*
  • Hover content, validation messages, and link-button text are rendered without HTML encoding; because validation text can originate from user-entered values and help text from a database table, unencoded rendering is a potential stored/reflected cross-site-scripting exposure if either source is not fully trusted.*
  • No authentication or authorization logic exists in this library — help text retrieval has no user filter and no role/permission check is present anywhere.
  • Several hard-coded hosting-environment paths are required at runtime (/Resources/Scripts/SAIFAJAXControls.js, /Resources/Images/DefaultHelpImage.gif, /Resources/Images/DefaultModalGridCustomizer.gif); the packaging .nuspec ships only .vb source, so consumers must supply these assets independently.*
  • clsHelpTextCollection inherits the non-generic clsBusinessCollectionBase rather than the generic clsBusinessCollection(Of T) used elsewhere in the packaged set, suggesting an older framework generation.**

Note: Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified.

Sources

  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/SAIFAJAXControlAncestor.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/AutoBindControlAncestor.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingManager.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/BindingUtility.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/ModalGridCustomizer.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/InfragisticsGridCustomizer.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/GridCustomizationPanel.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpText.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/clsHelpTextCollection.vb
  • SAIF.Presentation.Web.Controls.AJAX.Infragistics111/SAIF.Presentation.Web.Controls.AJAX.Infragistics111.vbproj