Skip to content

SAIF.Presentation.Web.Controls.Infragistics103 architecture

This library is a presentation-tier WebForms control-extension set: each of its four public classes inherits directly from an Infragistics WebUI v10.3 control (or, for clsDropDownController, from the base ASP.NET System.Web.UI.Control) and adds SAIF-specific behavioral overrides — client-side script injection, sentinel-value suppression, cascading-dropdown filtering, and masked-value cleanup — without performing data access or business-object orchestration of its own. It does perform one navigation-triggering behavior: SAIFWarp registers a client-side error handler that, on a qualifying async-refresh error, causes the browser to navigate to /weberror/processError.aspx?MSG={0} (see Business rules — BR-4).

Responsibilities

  • Wrap Infragistics.WebUI.Misc.WebAsyncRefreshPanel (SAIFWarp) to add centralized async-refresh error redirection, a progress-indicator init script, and post-refresh focus restoration for a designated child control.
  • Wrap Infragistics.WebUI.WebDataInput.WebDateTimeEdit (SAIFWebDateTimeEdit) to suppress Infragistics' sentinel "null date" values (01/01/1901, 12/31/9999) from being shown to the user on focus.
  • Wrap Infragistics.WebUI.WebDataInput.WebMaskEdit (SAIFWebMaskEdit) to expose cleaned PhoneValue/TaxIdValue accessors that strip mask placeholders and dangling extension markers.
  • Wire cascading/dependent value lists on two UltraGridColumn instances of an UltraWebGrid (clsDropDownController), generating client-side JavaScript that filters the second column's dropdown options based on the first column's selected value.
  • Inject client-side JavaScript into the hosting ASP.NET page via Page.ClientScript.RegisterClientScriptBlock / RegisterStartupScript, guarding each registration against duplicate injection.
  • The library performs no data access or business-object orchestration, and no class performs its own server-side navigation; the sole browser navigation is client-side, triggered by the SAIFWarp error script described above*.

Component boundaries

  • SAIFWarp: boundary around WebAsyncRefreshPanel. Owns async-refresh error handling (redirect to /weberror/processError.aspx on flags > 1), the progress-indicator init script, and a hidden {ID}_FOCUS field used to restore focus to a named control after an async postback.
  • clsDropDownController: boundary around a pair of UltraGridColumn value lists on an UltraWebGrid. Owns reflection-based extraction of code/display/key values from arbitrary List1/List2 data sources (via System.ComponentModel.TypeDescriptor) and generation of the BeforeEdit{Column2.Key} client-side filter function. It has no awareness of any specific business entity type, making it a generic grid-cell binder rather than a business-object-aware component*.
  • SAIFWebDateTimeEdit: boundary around WebDateTimeEdit. Owns only the onfocus sentinel-date-suppression script.
  • SAIFWebMaskEdit: boundary around WebMaskEdit. Owns only the PhoneValue/TaxIdValue read-only accessors and the PHONE_EXT constant.
  • No shared base class, binder framework, or factory exists across these four components — each is a standalone control wrapper with its own lifecycle overrides*, unlike the "Binder" pattern used elsewhere in the SAIF presentation stack.

Interaction model

  • Consuming ASP.NET WebForms pages add these controls declaratively via their ToolboxData markup (e.g., <{0}:SAIFWARP runat=server>); there is no dependency-injection, factory, or service-locator usage.
  • SAIFWarp and SAIFWebDateTimeEdit are driven entirely by the ASP.NET page lifecycle: they override Init/PreRender (and, for SAIFWarp, CreateChildControls/RenderContents) to register client scripts and wire ClientSideEvents properties (RefreshComplete, Error, InitializePanel). In SAIFWarp_Init, the RefreshComplete and InitializePanel client-side event wiring (and the FOCUS_SCRIPT registration) occur only when Not DesignMode and ControlsFocus is True; when ControlsFocus is False, none of that wiring runs during Init.
  • clsDropDownController is driven by an explicit DataBind() call from a consuming page/control (typically during grid setup): it binds Column1/Column2 value lists from List1/List2, uses reflection to project data-source items into internal ListItem DTOs, and registers a generated JavaScript block ("DD") that Infragistics invokes client-side via BeforeEnterEditModeHandler when a Column2 cell enters edit mode.
  • All JavaScript-driven behavioral effects execute in the browser: SAIFWarp's error/focus scripts, SAIFWebDateTimeEdit's sentinel-date suppression, and clsDropDownController's cascading filter are all generated and registered server-side but enforced entirely by client-side script, including the error handler's browser-side navigate call to the shared error page*.
  • SAIFWebMaskEdit's PhoneValue/TaxIdValue are the exception to that client-side-enforcement pattern: they are plain server-side property getters read by consuming code after postback, not client-script-driven. They perform no server round trip, database interaction, or navigation of their own.

Architecture diagram

The following diagram shows the high-level component interactions between a consuming page, this library's control wrappers, their Infragistics base classes, and the browser.

flowchart TD
    Page["Consuming ASP.NET page<br>(declarative markup)"] --> SAIFWarp["SAIFWarp"]
    Page --> DropDown["clsDropDownController"]
    Page --> DateEdit["SAIFWebDateTimeEdit"]
    Page --> MaskEdit["SAIFWebMaskEdit"]
    SAIFWarp --> WebAsyncRefreshPanel["Infragistics WebAsyncRefreshPanel"]
    DropDown --> UltraWebGrid["Infragistics UltraWebGrid<br>(UltraGridColumn)"]
    DateEdit --> WebDateTimeEdit["Infragistics WebDateTimeEdit"]
    MaskEdit --> WebMaskEdit["Infragistics WebMaskEdit"]
    SAIFWarp -.->|registers script| Browser["Browser client-side JS"]
    DropDown -.->|registers script| Browser
    DateEdit -.->|registers script| Browser
    Browser -.->|Error flags > 1| ErrorPage["/weberror/processError.aspx"]

Sequence diagram

The following diagram shows the primary cascading-dropdown data-bind and client-side filter sequence.

sequenceDiagram
    participant ConsumingPage as Consuming page
    participant Controller as clsDropDownController
    participant Grid as UltraWebGrid (client)
    participant Browser
    ConsumingPage->>Controller: DataBind()
    Controller->>Controller: Bind Column1/Column2 ValueList from List1/List2 (reflection via TypeDescriptor)
    Controller->>Controller: GenerateJavaScript()
    Controller->>Browser: RegisterClientScriptBlock("DD", script)
    Browser->>Grid: User begins editing Column2 cell
    Grid->>Browser: BeforeEnterEditModeHandler fires -> BeforeEdit{Column2.Key}(gridName, cellId)
    Browser->>Browser: switch(catCell) selects filtered vListFilter
    Browser-->>Grid: col.ValueList replaced with filtered options

Design constraints

  • Requires ASP.NET WebForms on .NET Framework 4.6.1 and is written in VB.NET; it cannot be consumed by non-WebForms (e.g., MVC/API) hosts.
  • Tightly version-coupled to Infragistics v10.3 assemblies (Infragistics35.Web.v10.3, Infragistics35.WebUI.Misc.v10.3, Infragistics35.WebUI.Shared.v10.3, Infragistics35.WebUI.UltraWebGrid.v10.3, Infragistics35.WebUI.WebDataInput.v10.3, all version 10.3.20103.2120) — every public type's base class comes from this vendor library set.
  • No <ProjectReference> elements exist in the project file; the SAIF.Presentation, SAIF.Presentation.Web, and SAIF.Presentation.Web.Controls.V2 namespaces are brought in only via project-level VB Imports, so the actual assembly/compilation relationship to those namespaces is not directly confirmed from the project file alone**.
  • The project's AssemblyName (SAIF.Presentation.Web.Controls.Infragistics103) differs from its RootNamespace/imported namespace (SAIF.Presentation.Web.Controls.V2), indicating this project's compiled types are intended to logically extend the SAIF.Presentation.Web.Controls.V2 namespace rather than form an independent one*.
  • Per the root .nuspec, this project's .vb source is bundled directly into the SAIF.BOF.Presentation.Web.Infragistics103 package rather than being packaged as its own compiled assembly; the actual compiled output is supplied by a sibling project's build (SAIF.Presentation.Web.Core.Infragistics103)*.
  • clsDropDownController relies on reflection (System.ComponentModel.TypeDescriptor) to read arbitrary data-source properties named by List1Code/List1Display/List2Code/List2Display/List2Key; if no TypeConverter to String is found for a given property, the corresponding ListItem field is silently left blank rather than raising an error.
  • No dependency-injection, factory, or abstract binder framework is present; all four classes are standalone, instantiated declaratively as server controls.

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.Infragistics103\SAIF.Presentation.Web.Controls.Infragistics103.vbproj
  • SAIF.Presentation.Web.Controls.Infragistics103\SAIFWarp.vb
  • SAIF.Presentation.Web.Controls.Infragistics103\clsDropDownController.vb
  • SAIF.Presentation.Web.Controls.Infragistics103\SAIFWebDateTimeEdit.vb
  • SAIF.Presentation.Web.Controls.Infragistics103\SAIFWebMaskEdit.vb
  • SAIF.Presentation.Web.Controls.Infragistics103\My Project\AssemblyInfo.vb
  • SAIF.BOF.Presentation.Web.Infragistics103.nuspec
  • SAIF.Presentation.Web.Infragistics103.sln