---
title: SAIF.Presentation.Web.Core.Infragistics111 operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF Doc Gen
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Core.Infragistics111
reference_type: package
---

# SAIF.Presentation.Web.Core.Infragistics111 operations and processes

This page is the operation catalog and cross-operation hub for this library. Each operation's detailed, step-by-step logic lives in its own page under `operations/`.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules |
| --- | --- | --- | --- | --- | --- |
| [Initialize page (session ping + control reset)](operations/initialize-page.md) | Wire session keep-alive and normalize control back colors on page load | ASP.NET `Init`/`Load` lifecycle of a page deriving from `AppViewPageBase` | `EnableSessionPing`, `CallResetBackcolor`, client classification | Registered client scripts; reset control CSS classes | [BR-CORE-001](business-rules.md#br-core-001-session-keep-alive-is-enabled-by-default-on-every-saif-application-page), [BR-CORE-002](business-rules.md#br-core-002-session-keep-alive-scripts-are-never-emitted-to-externally-classified-clients), [BR-CORE-003](business-rules.md#br-core-003-the-session-ping-script-is-registered-at-most-once-per-page), [BR-CORE-004](business-rules.md#br-core-004-control-back-colors-are-re-normalized-on-every-page-load-unless-the-page-opts-out) |
| [Reset control back colors](operations/reset-control-back-colors.md) | Normalize CSS back-color classes across a control tree | Called from `Page_Load` or directly by consuming pages | Root `System.Web.UI.Control` | Mutated `CssClass` values across the control tree | [BR-CORE-005](business-rules.md#br-core-005-colour-state-is-carried-by-css-classes-and-previous-state-classes-are-stripped-before-a-new-one-is-applied), [BR-CORE-006](business-rules.md#br-core-006-the-menu-context-text-box-cvtextbox-is-exempt-from-back-color-reset), [BR-CORE-007](business-rules.md#br-core-007-read-only-input-controls-render-with-disabledbackcolor-editable-ones-render-with-defaultbackcolor), [BR-CORE-008](business-rules.md#br-core-008-buttons-radio-buttons-and-check-boxes-render-with-the-normal-css-class) |
| [Protect / unprotect a control](operations/protect-unprotect-a-control.md) | Make a field read-only/disabled, or reverse that transformation | Consuming page marks a field read-only, editable, or error-flagged | Target `Control` | Mutated `CssClass`, `ReadOnly`, `Enabled`, `Visible` (and, for drop-downs, a substituted text box) | [BR-CORE-009](business-rules.md#br-core-009-protecting-a-control-makes-it-read-only-or-disabled-and-applies-the-disabled-background), [BR-CORE-010](business-rules.md#br-core-010-a-protected-dropdownlist-is-hidden-and-replaced-by-a-read-only-text-box-whose-id-is-the-drop-down-id-with-ddl-replaced-by-txt) |
| [Apply saved grid preferences](operations/apply-saved-grid-preferences.md) | Re-apply a user's saved column, sort, and size layout to a grid | Consuming page rendering a grid | Grid instance, optional size `div`, `m_controller.Model.Preferences` | Reordered/resized grid columns, applied sort, applied grid height/width | [BR-CORE-011](business-rules.md#br-core-011-grid-layout-preferences-are-keyed-by-preference-type-grid-id-band-key), [BR-CORE-012](business-rules.md#br-core-012-stored-column-order-widths-and-grid-size-are-re-applied-when-the-grid-renders), [BR-CORE-013](business-rules.md#br-core-013-stored-sort-preferences-are-re-applied-and-can-be-converted-into-an-order-by-fragment-for-the-callers-query) |
| [Save / clear grid preferences](operations/save-clear-grid-preferences.md) | Persist or remove a user's grid layout preferences | User saves or resets a grid layout | Grid instance, `IncludeSort` flag, optional height/width, `SizeOnly` flag | Persisted or removed preference entries | [BR-CORE-014](business-rules.md#br-core-014-saving-preferences-captures-every-column-of-every-band-as-comma-delimited-key-and-width-lists), [BR-CORE-015](business-rules.md#br-core-015-sort-preferences-are-stored-only-when-the-caller-requests-it-and-a-non-empty-sort-actually-exists), [BR-CORE-016](business-rules.md#br-core-016-grid-size-is-persisted-only-when-both-height-and-width-are-greater-than-zero-in-hpxwpx-form) |
| [Resolve navigation and authorized menu context](operations/resolve-navigation-and-authorized-menu-context.md) | Load and query a user's authorized menu items and current-page navigation state | Construction of a `NavigationContext` for a signed-in user, then per-request navigation queries | User ID, `MENU_ENVIRONMENT` app setting, request path/URL | `clsMenuAuthorizedItem` instances, item sequence numbers, menu-membership booleans | [BR-CORE-017](business-rules.md#br-core-017-menu-data-is-always-read-as-the-fixed-database-user-menu-against-the-environment-named-by-the-menu_environment-app-setting), [BR-CORE-018](business-rules.md#br-core-018-user-ids-are-trimmed-and-upper-cased-before-authorized-item-lookup), [BR-CORE-019](business-rules.md#br-core-019-navigation-answers-are-restricted-to-the-menu-items-the-user-is-authorized-for), [BR-CORE-020](business-rules.md#br-core-020-application-codes-and-menu-category-codes-are-loaded-once-and-cached-for-the-life-of-the-process), [BR-CORE-021](business-rules.md#br-core-021-when-the-current-application-path-does-not-map-to-a-known-application-code-navigation-lookups-return-no-item), [BR-CORE-022](business-rules.md#br-core-022-page-and-item-lookups-prefer-an-exact-link-match-and-fall-back-to-a-partial-match), [BR-CORE-023](business-rules.md#br-core-023-getitem-with-inanyapp-true-searches-by-category-across-all-applications-ignoring-the-current-application-code) |
| [Send mail through the legacy mail service](operations/send-mail-through-the-legacy-mail-service.md) | Dispatch outbound mail (with optional attachment) via the legacy SAIF SOAP mail service | Consuming applications/models call `SendMail` / `SendMailWithAttachment` | To, from, subject, optional body, optional attachment | Mail dispatched by the remote service | [BR-CORE-024](business-rules.md#br-core-024-outbound-mail-is-sent-through-the-legacy-mail-web-service-whose-url-comes-from-the-legacymailwebserviceurl-configuration-setting) |
| [Open an e-mail compose window from the browser](operations/open-an-e-mail-compose-window-from-the-browser.md) | Launch a client-side `mailto:` compose window | Consuming page action | Recipient, optional CC, subject, body | Registered client script opening a `mailto:` window | [BR-CORE-025](business-rules.md#br-core-025-recipient-and-subject-text-are-sanitized-before-being-placed-in-a-mailto-url), [BR-CORE-026](business-rules.md#br-core-026-a-cc-recipient-is-included-in-the-mailto-link-only-when-a-non-empty-cc-value-is-supplied) |
| [Stream a file download to the browser](operations/stream-a-file-download-to-the-browser.md) | Deliver an already-created file to the browser as a download | Consuming page requests a download | Virtual file name, owning `AppViewPageBase` | HTTP response carrying the file as an attachment | [BR-CORE-027](business-rules.md#br-core-027-download-content-type-is-derived-from-the-file-extension-txt-textplain-csv-applicationvndms-excel) |
| [Set client-side focus](operations/set-client-side-focus.md) | Focus (and optionally select) the correct client-side element for a control | Master page `PreRender`, or explicit `NavigationManager` use | `FocusControl` property, `Session("focuscontrol")` | Registered startup script focusing the target control | [BR-CORE-028](business-rules.md#br-core-028-no-focus-script-is-emitted-when-the-master-page-has-no-focus-control), [BR-CORE-029](business-rules.md#br-core-029-client-side-focus-targeting-is-control-type-specific-because-infragistics-editors-render-nested-input-elements), [BR-CORE-030](business-rules.md#br-core-030-focus-is-applied-100-ms-after-load-inside-a-trycatch-so-a-missing-element-never-breaks-the-page), [BR-CORE-031](business-rules.md#br-core-031-the-saifmenu-controls-focus-target-is-redirected-to-the-cvtextbox-context-box) |
| [Load a drop-down list](operations/load-a-drop-down-list.md) | Bind a list control or grid column to a data source with an optional blank entry | Consuming page binding a list control | Target list control/grid column, data source, value/text fields, `DDLAddItems` mode | Populated list control or grid drop-down editor provider | [BR-CORE-032](business-rules.md#br-core-032-drop-down-lists-may-be-pre-pended-with-a-blank-entry-rendered-as-a-literal-blank-an-empty-string-or-a-space-per-ddladditems) |
| [Grid client-side interaction helpers](operations/grid-client-side-interaction-helpers.md) | Place the user in a specific grid cell after a postback | Consuming page needs a post-postback grid focus | `Page`, grid ID, target row/record, column key | Registered client scripts targeting the Infragistics client-side grid API | [BR-CORE-033](business-rules.md#br-core-033-grid-scrollbegin-editfocus-behavior-is-implemented-per-infragistics-grid-flavour-ultrawebgrid-webdatagrid-webhierarchicaldatagrid) |
| [Enable or disable a page or control subtree](operations/enable-or-disable-a-page-or-control-subtree.md) | Switch a page or control subtree between read and edit modes | Consuming page toggles read/edit mode | `Control`, `Page`, or `SAIFMenuTop.clsMenuButton`; enable flag | Enabled/disabled controls | [BR-CORE-034](business-rules.md#br-core-034-disabling-a-page-disables-every-control-it-contains) |
| [Nested master page and control resolution](operations/nested-master-page-and-control-resolution.md) | Locate a control that lives in an ancestor master page | Consuming page/control needs an ancestor-master control | `Page`, control ID, optional content placeholder ID | `MasterPage` or `Control` reference | [BR-CORE-035](business-rules.md#br-core-035-the-root-master-page-is-the-first-ancestor-master-with-no-parent-master), [BR-CORE-036](business-rules.md#br-core-036-control-search-within-nested-masters-is-scoped-to-the-named-content-placeholder-when-one-is-supplied), [BR-CORE-037](business-rules.md#br-core-037-if-the-recursive-nested-search-finds-nothing-a-direct-findcontrol-on-the-root-master-is-attempted) |
| [Validate numeric menu context](operations/validate-numeric-menu-context.md) | Determine whether a postback carries a valid numeric menu context value | Controller processing a postback | Control-value `Hashtable`, menu control name | `Boolean` | [BR-CORE-038](business-rules.md#br-core-038-menu-context-is-only-validated-on-postbacks-and-only-when-the-menu-control-supplied-a-value), [BR-CORE-039](business-rules.md#br-core-039-a-numeric-menu-context-is-valid-only-when-it-is-numeric-and-greater-than-0) |
| [Clean text for output](operations/clean-text-for-output.md) | Sanitize raw text before it reaches e-mail, reports, or `mailto:` links | Called before sending text to e-mail, reports, or `mailto:` links | Raw text | Sanitized text | [BR-CORE-040](business-rules.md#br-core-040-known-word-originated-characters-smart-quotes-bullets-tabs-are-normalized-before-text-leaves-the-application), [BR-CORE-041](business-rules.md#br-core-041-only-printable-ascii-32126-plus-cr-and-lf-survive-cleanstring-all-other-characters-become-spaces), [BR-CORE-042](business-rules.md#br-core-042-mailto-text-has-and-removed-and-and-crlftab-url-encoded) |

## Process flow diagram
The following diagram visualizes the primary operational flow across operations.

```mermaid
flowchart TD
	Start([Page request]) --> Init["AppViewPageBase.Page_Init<br>Initialize page"]
	Init --> Load["Page_Load"]
	Load --> Ping["Session ping<br>(if enabled and not external)"]
	Load --> Reset["Reset control back colors"]
	Load --> Grid["Apply saved grid preferences"]
	Grid --> User{"User edits grid<br>and saves layout?"}
	User -->|Yes| Save["Save / clear grid preferences"]
	Load --> Nav["Resolve navigation and<br>authorized menu context"]
	Load --> Focus["Set client-side focus"]
	User -->|Sends mail| Mail["Send mail through<br>the legacy mail service"]
	User -->|Downloads file| Download["Stream a file download<br>to the browser"]
```

## Failure and edge-case behavior
- Session-ping registration is a no-op after the first call in a page lifecycle (registered script block check), so repeated `Load` events never duplicate the script.
- Client control protection (`ProtectItem`) absorbs `DropDownList`-to-text-box substitution failures in a `Try` block rather than raising to the caller.
- `SendMail` / `SendMailWithAttachment` are declared `As Boolean` but never assign a return value, so callers always observe `False` regardless of whether the mail was actually dispatched.*
- `ClearPreferences` calls `Preferences.Save()` twice in succession in both the `UltraWebGrid` and `WebDataGrid` overloads — a redundant call with no functional effect beyond the extra round trip.*
- Client-side focus scripts are wrapped in `try{...}catch(e){}` so a missing DOM element never breaks page rendering.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [Configuration](configuration.md)
- [Security and authorization](security-authorization.md)
- [API reference](api/index.md)

## Sources
- `SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/AppViewMasterPageBase.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/clsAppControllerBase.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/clsMailMessage.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/clsNestedMaster.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/clsStringUtilities.vb`
- `SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb`
