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 cleanedPhoneValue/TaxIdValueaccessors that strip mask placeholders and dangling extension markers. - Wire cascading/dependent value lists on two
UltraGridColumninstances of anUltraWebGrid(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
SAIFWarperror script described above*.
Component boundaries¶
SAIFWarp: boundary aroundWebAsyncRefreshPanel. Owns async-refresh error handling (redirect to/weberror/processError.aspxonflags > 1), the progress-indicator init script, and a hidden{ID}_FOCUSfield used to restore focus to a named control after an async postback.clsDropDownController: boundary around a pair ofUltraGridColumnvalue lists on anUltraWebGrid. Owns reflection-based extraction of code/display/key values from arbitraryList1/List2data sources (viaSystem.ComponentModel.TypeDescriptor) and generation of theBeforeEdit{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 aroundWebDateTimeEdit. Owns only theonfocussentinel-date-suppression script.SAIFWebMaskEdit: boundary aroundWebMaskEdit. Owns only thePhoneValue/TaxIdValueread-only accessors and thePHONE_EXTconstant.- 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
ToolboxDatamarkup (e.g.,<{0}:SAIFWARP runat=server>); there is no dependency-injection, factory, or service-locator usage. SAIFWarpandSAIFWebDateTimeEditare driven entirely by the ASP.NET page lifecycle: they overrideInit/PreRender(and, forSAIFWarp,CreateChildControls/RenderContents) to register client scripts and wireClientSideEventsproperties (RefreshComplete,Error,InitializePanel). InSAIFWarp_Init, theRefreshCompleteandInitializePanelclient-side event wiring (and theFOCUS_SCRIPTregistration) occur only whenNot DesignModeandControlsFocusisTrue; whenControlsFocusisFalse, none of that wiring runs duringInit.clsDropDownControlleris driven by an explicitDataBind()call from a consuming page/control (typically during grid setup): it bindsColumn1/Column2value lists fromList1/List2, uses reflection to project data-source items into internalListItemDTOs, and registers a generated JavaScript block ("DD") that Infragistics invokes client-side viaBeforeEnterEditModeHandlerwhen 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, andclsDropDownController's cascading filter are all generated and registered server-side but enforced entirely by client-side script, including the error handler's browser-sidenavigatecall to the shared error page*. SAIFWebMaskEdit'sPhoneValue/TaxIdValueare 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 version10.3.20103.2120) — every public type's base class comes from this vendor library set. - No
<ProjectReference>elements exist in the project file; theSAIF.Presentation,SAIF.Presentation.Web, andSAIF.Presentation.Web.Controls.V2namespaces are brought in only via project-level VBImports, 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 itsRootNamespace/imported namespace (SAIF.Presentation.Web.Controls.V2), indicating this project's compiled types are intended to logically extend theSAIF.Presentation.Web.Controls.V2namespace rather than form an independent one*. - Per the root
.nuspec, this project's.vbsource is bundled directly into theSAIF.BOF.Presentation.Web.Infragistics103package 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)*. clsDropDownControllerrelies on reflection (System.ComponentModel.TypeDescriptor) to read arbitrary data-source properties named byList1Code/List1Display/List2Code/List2Display/List2Key; if noTypeConvertertoStringis found for a given property, the correspondingListItemfield 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.
Related documentation¶
- Index
- Overview
- Dependencies
- Operations and processes
- Business rules
- Control catalog
- Configuration settings
- API reference
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