Skip to content

SAIF.Presentation.Web.Controls.V2 architecture

This library is a presentation-tier ASP.NET WebForms custom-control library. It contains only System.Web.UI.Control/WebControl subclasses (and their supporting models/enums/designers) that are compiled directly into the SAIF.BOF.Presentation.Web.Infragistics103 package assembly for reuse across SAIF WebForms applications. It performs no database access, no WCF/service calls, and no business-rule evaluation — its sole responsibility is rendering HTML/JavaScript UI chrome and input widgets for consuming pages.

Responsibilities

  • Provide thin subclasses of standard WebForms input controls (SAIFCheckBox, SAIFCheckBoxList, SAIFRadioButton, SAIFRadioButtonList, SAIFDropDownList, SAIFTextBox, SAIFComboBox, SAIFListBox, SAIFButton) that add a consistent [ReadOnly] image-based rendering convention, AJAX "busy indicator" wiring, or minor UX behavior (character counters, enum binding) on top of their base controls.
  • Provide composite layout/chrome controls (SAIFPanel, SAIFTabBar, SAIFTabs, ConditionsGrid, SAIFGrid) that manage child-control trees, collapsible state, and tab-selection state, persisted via ViewState.
  • Render site-wide chrome (BannerControl, BannerControlV2) by reading an external XML resource file (SITEBANNER.XML/SITEBANNERV2.XML) at runtime, varying banner content and links by internal-vs-external client context and by whether the current page is the login screen.
  • Supply narrowly scoped, cross-cutting UX helpers: client-side auto-focus scripting (FocusManager), control-enable-state attribute tagging (Utilities.mdlUtilities), duplicate-submit prevention (OneClickSubmit), status-message iconography (SAIFMessage), and an alphabet index bar (SAIFAlphaNumericLinkControl/SAIFLinkButton).
  • Present a UI-only, non-business-rule column layout for medical-condition data via ConditionsGrid (ClaimDecision, DecisionDate, MedicalConditionDescr, MedicallyStationaryDate)*.

Component boundaries

  • Input-control wrappers: SAIFCheckBox, SAIFCheckBoxList, SAIFRadioButton, SAIFRadioButtonList, SAIFDropDownList, SAIFTextBox, SAIFComboBox, SAIFListBox, SAIFButton — each derives from the corresponding native System.Web.UI.WebControls control and overrides Render/property accessors only; no shared base class or cross-control coupling among them.
  • Layout/chrome controls: SAIFPanel (+ SAIFPanelDesigner, PanelState), SAIFTabBar (+ SAIFTabBarTab, SAIFTabBarTabCollection, Sorter(Of T), SortOrder, TabBarMode), SAIFTabs (+ SAIFTabsDesigner, TabSettings, SAIFTabEventArgs), ConditionsGrid, SAIFGrid — own composite child-control trees and ViewState-backed UI state; two structurally independent tab implementations coexist here (declarative SAIFTabBar vs. imperative SAIFTabs)*.
  • Site-wide chrome: BannerControl, BannerControlV2 — the only controls in this library that read an external file resource (SITEBANNER.XML/SITEBANNERV2.XML, resolved via HttpContext.Current.Server.MapPath) and branch on the shared SAIF.Framework AppGlobal.EnvironmentService environment context.
  • Cross-cutting helpers: FocusManager, Utilities.mdlUtilities, OneClickSubmit, SAIFMessage, SAIFAlphaNumericLinkControl/SAIFLinkButton/AlphaNumericCharacter — small, self-contained utilities with no dependencies on the other component groups.
  • No .aspx/.ascx markup exists in this project; all boundaries above are compiled .vb server controls only.

Interaction model

  • Consuming SAIF WebForms pages declare/instantiate controls from any of the four component groups directly on their pages/master pages; the groups do not call into one another (except that all controls share the standard System.Web.UI.Control lifecycle and ViewState).
  • All controls follow the standard WebForms lifecycle (Init → CreateChildControls/DataBind → PreRender → Render), persisting state through ViewState (e.g., SAIFCheckBox.[ReadOnly], SAIFPanel.PanelState, SAIFTabBar.Tabs) rather than any backing store.
  • Postback interaction (tab clicks, banner logout, checkbox/radio selection changes) is handled through standard ASP.NET control events (LinkButton.Click, CheckBoxList.SelectedIndexChanged); no custom IPostBackEventHandler implementation was found**.
  • BannerControl/BannerControlV2 are the only controls that reach outside the control tree: they read SITEBANNER.XML/SITEBANNERV2.XML from disk and query SAIF.Framework's AppGlobal.EnvironmentService.IsClientExternal to decide internal-vs-external rendering.
  • MultiListControl additionally branches its client-side layout on Page.Request.Browser.Browser.ToUpper = "FIREFOX", a legacy browser-sniffing pattern*.
  • Several controls (SAIFButton, SAIFComboBox, SAIFListBox) inject client-side JavaScript for an AJAX "busy indicator"; the referenced .js files (e.g. Button.js, ComboBox.js) are not present in this project and their exact client behavior could not be verified from this library's source**.

Architecture diagram

The following diagram shows how consuming pages compose controls from the four component groups, and how the banner controls are the only ones reading an external XML resource and the shared AppGlobal environment service.

flowchart TD
    A[Consuming SAIF WebForms page] --> B[Input-control wrappers<br>SAIFCheckBox / SAIFRadioButton / SAIFDropDownList / SAIFTextBox / SAIFComboBox / SAIFListBox / SAIFButton]
    A --> C[Layout/chrome controls<br>SAIFPanel / SAIFTabBar / SAIFTabs / SAIFGrid / ConditionsGrid]
    A --> D[Site chrome<br>BannerControl / BannerControlV2]
    A --> E[Cross-cutting helpers<br>FocusManager / OneClickSubmit / SAIFMessage / SAIFAlphaNumericLinkControl / mdlUtilities]
    D --> F[SITEBANNER.XML / SITEBANNERV2.XML resource file]
    D --> G[SAIF.Framework AppGlobal.EnvironmentService]
    C --> H[ViewState]
    B --> H

Sequence diagram

The following diagram shows the primary banner-rendering and logout sequence for BannerControl/BannerControlV2.

sequenceDiagram
    participant Page as Consuming page
    participant Banner as BannerControl/BannerControlV2
    participant Env as AppGlobal.EnvironmentService
    participant XML as SITEBANNER(V2).XML
    Page->>Banner: OnInit (render pipeline)
    Banner->>Env: IsClientExternal
    Env-->>Banner: internal/external flag
    Banner->>Banner: SetBannerControlDefaults()
    Banner->>XML: Load banner XML via Server.MapPath
    XML-->>Banner: print/display nodes
    Banner-->>Page: Rendered banner HTML
    Page->>Banner: Logout LinkButton click (postback)
    Banner->>Banner: FeedbackHelpLogout_Click (Session.Abandon, clear cookies)
    Banner-->>Page: Redirect to /OnlineLogin/loginscreen.aspx

Design constraints

  • The project has no <ProjectReference> elements; all SAIF ecosystem dependencies (SAIF.Framework, SAIF.Framework.Security, SAIF.Framework.Common, SAIF.Framework.Preferences, SAIF.HashUtil) are resolved as compiled NuGet package references, not source project references.
  • This project's .vb sources are not compiled into their own standalone assembly; the .nuspec bundles them into src\presentation\saif.presentation.web.controls.v2, and the package's shipped binary (lib\net45) is built from the SAIF.Presentation.Web.Core.Infragistics103 project's output DLL*.
  • No third-party UI toolkit packages (e.g., Infragistics, AJAX Control Toolkit) are referenced from this project's .vbproj, despite the sibling repository-root .nuspec bundling an AjaxControlToolkit.dll binary into the overall package*.
  • Target framework is .NET Framework 4.6.1; controls rely entirely on ViewState for state persistence, with no configuration-driven behavior (no ConfigurationManager/AppSettings reads were found).
  • BannerControl/BannerControlV2 behavior is environment-conditional on AppGlobal.EnvironmentService.IsClientExternal and on the current virtual directory equaling "ONLINELOGIN" — this is the only environment-conditional logic in the library.
  • Two structurally independent, parallel tab-bar implementations (SAIFTabBar/declarative vs. SAIFTabs/imperative) coexist without a shared base class; whether both are still actively consumed by downstream applications could not be determined from this library alone**.

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.V2\SAIF.Presentation.Web.Controls.V2.vbproj
  • SAIF.Presentation.Web.Controls.V2\packages.config
  • SAIF.Presentation.Web.Controls.V2\Banner.vb
  • SAIF.Presentation.Web.Controls.V2\BannerControlV2.vb
  • SAIF.Presentation.Web.Controls.V2\ConditionsGrid.vb
  • SAIF.Presentation.Web.Controls.V2\FocusManager.vb
  • SAIF.Presentation.Web.Controls.V2\mdlUtilities.vb
  • SAIF.Presentation.Web.Controls.V2\MultiListControl.vb
  • SAIF.Presentation.Web.Controls.V2\OneClickSubmitControl.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFAlphaNumericLinkControl.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFButton.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFCheckBox.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFCheckBoxList.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFComboBox.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFDropDownList.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFGrid.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFHoverHelp.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFListBox.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFMessage.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFPanel.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFRadioButton.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFRadioButtonList.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFTabBar.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFTabs.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFTabsDesigner.vb
  • SAIF.Presentation.Web.Controls.V2\SAIFTextBox.vb
  • SAIF.Presentation.Web.Controls.V2\TabSettings.vb
  • SAIF.BOF.Presentation.Web.Infragistics103.nuspec