---
title: SAIF.Presentation.Web.Core.Infragistics111 business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
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 business rules

This page captures business rules enforced by this library.

## BR-CORE-001: Session keep-alive is enabled by default on every SAIF application page

| Field | Value |
| --- | --- |
| **Statement** | Session keep-alive is enabled by default on every SAIF application page. |
| **Trigger** | Page `Init` |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`Page_Init`) |
| **Outcome** | `EnableSessionPing = True` unless the page overrides it. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-002: Session keep-alive scripts are never emitted to externally-classified clients

| Field | Value |
| --- | --- |
| **Statement** | Session keep-alive scripts are never emitted to externally-classified clients. |
| **Trigger** | `CallSessionPing` with `EnableSessionPing = True` |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`CallSessionPing`) |
| **Outcome** | External clients receive no ping script and their sessions time out normally. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-003: The session ping script is registered at most once per page

| Field | Value |
| --- | --- |
| **Statement** | The session ping script is registered at most once per page. |
| **Trigger** | Script block `SessionPing` already registered |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`CallSessionPing`) |
| **Outcome** | Duplicate registration is skipped. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-004: Control back-colors are re-normalized on every page load unless the page opts out

| Field | Value |
| --- | --- |
| **Statement** | Control back-colors are re-normalized on every page load unless the page opts out. |
| **Trigger** | Page `Load` with `CallResetBackcolor = True` |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`Page_Load`) |
| **Outcome** | Consistent field colouring across postbacks. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-005: Colour state is carried by CSS classes, and previous state classes are stripped before a new one is applied

| Field | Value |
| --- | --- |
| **Statement** | Colour state is carried by CSS classes, and previous state classes are stripped before a new one is applied. |
| **Trigger** | `ResetBackColor` on any control exposing `CssClass` |
| **Enforcement** | `clsControlManager.vb` (`ResetBackColor`) |
| **Outcome** | No accumulation of `errorbackcolor` / `disabledbackcolor` / `defaultbackcolor` tokens. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-006: The menu context text box (CVTextBox) is exempt from back-color reset

| Field | Value |
| --- | --- |
| **Statement** | The menu context text box (`CVTextBox`) is exempt from back-color reset. |
| **Trigger** | Control `ID` = `CVTextBox` |
| **Enforcement** | `clsControlManager.vb` (`ResetBackColor`) |
| **Outcome** | Menu context box keeps its own styling. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-007: Read-only input controls render with `disabledbackcolor`; editable ones render with `defaultbackcolor`

| Field | Value |
| --- | --- |
| **Statement** | Read-only input controls render with `disabledbackcolor`; editable ones render with `defaultbackcolor`. |
| **Trigger** | `ResetBackColor` on an input/editor control |
| **Enforcement** | `clsControlManager.vb` (`ResetBackColor`) |
| **Outcome** | Users can visually distinguish editable fields. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-008: Buttons, radio buttons and check boxes render with the `normal` CSS class

| Field | Value |
| --- | --- |
| **Statement** | Buttons, radio buttons and check boxes render with the `normal` CSS class. |
| **Trigger** | `ResetBackColor` on those control types |
| **Enforcement** | `clsControlManager.vb` (`ResetBackColor`) |
| **Outcome** | Consistent button/selection styling. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-009: Protecting a control makes it read-only (or disabled) and applies the disabled background

| Field | Value |
| --- | --- |
| **Statement** | Protecting a control makes it read-only (or disabled) and applies the disabled background. |
| **Trigger** | `ProtectItem` |
| **Enforcement** | `clsControlManager.vb` (`ProtectItem`) |
| **Outcome** | The field cannot be edited and is visibly disabled. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## 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`

| Field | Value |
| --- | --- |
| **Statement** | 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`. |
| **Trigger** | `ProtectItem` on a `DropDownList` |
| **Enforcement** | `clsControlManager.vb` (`ProtectItem`) |
| **Outcome** | The selected value is shown as read-only text. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-011: Grid layout preferences are keyed by preference type + grid ID + band key

| Field | Value |
| --- | --- |
| **Statement** | Grid layout preferences are keyed by preference type + grid ID + band key. |
| **Trigger** | Any Apply/Save/Clear preference call |
| **Enforcement** | `AppViewPageBase.aspx.vb` (preference regions) |
| **Outcome** | Each grid, and each band of a multi-band grid, keeps independent preferences. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-012: Stored column order, widths and grid size are re-applied when the grid renders

| Field | Value |
| --- | --- |
| **Statement** | Stored column order, widths and grid size are re-applied when the grid renders. |
| **Trigger** | `ApplyColumnPreferences` finds stored values |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`ApplyColumnPreferences`, `ApplyColSettings`) |
| **Outcome** | The user sees their own saved layout. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-013: Stored sort preferences are re-applied and can be converted into an ORDER BY fragment for the caller's query

| Field | Value |
| --- | --- |
| **Statement** | Stored sort preferences are re-applied and can be converted into an `ORDER BY` fragment for the caller's query. |
| **Trigger** | `ApplySortPreferences` / `GetSortPreferenceOrderBy` |
| **Enforcement** | `AppViewPageBase.aspx.vb` |
| **Outcome** | Grid sorting survives navigation away and back. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-014: Saving preferences captures every column of every band as comma-delimited key and width lists

| Field | Value |
| --- | --- |
| **Statement** | Saving preferences captures every column of every band as comma-delimited key and width lists. |
| **Trigger** | `SavePreferences` with `SizeOnly = False` |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`SavePreferences`) |
| **Outcome** | Complete layout is persisted. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-015: Sort preferences are stored only when the caller requests it and a non-empty sort actually exists

| Field | Value |
| --- | --- |
| **Statement** | Sort preferences are stored only when the caller requests it and a non-empty sort actually exists. |
| **Trigger** | `SavePreferences` with `IncludeSort = True` |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`SavePreferences`) |
| **Outcome** | Empty sort strings are not persisted. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-016: Grid size is persisted only when both height and width are greater than zero, in "<h>px,<w>px" form

| Field | Value |
| --- | --- |
| **Statement** | Grid size is persisted only when both height and width are greater than zero, in `"<height>px,<width>px"` form. |
| **Trigger** | `SavePreferences` with height and width supplied |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`SavePreferences`) |
| **Outcome** | Partial/zero sizes are ignored. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-017: Menu data is always read as the fixed database user MENU, against the environment named by the MENU_ENVIRONMENT app setting

| Field | Value |
| --- | --- |
| **Statement** | Menu data is always read as the fixed database user `MENU`, against the environment named by the `MENU_ENVIRONMENT` app setting. |
| **Trigger** | `NavigationContext` construction |
| **Enforcement** | `NavigationContext.vb` (`New`) |
| **Outcome** | Menu queries run under a dedicated, environment-specific account. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-018: User IDs are trimmed and upper-cased before authorized-item lookup

| Field | Value |
| --- | --- |
| **Statement** | User IDs are trimmed and upper-cased before authorized-item lookup. |
| **Trigger** | `NavigationContext` construction |
| **Enforcement** | `NavigationContext.vb` (`New`) |
| **Outcome** | Case and whitespace differences do not affect authorization results. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-019: Navigation answers are restricted to the menu items the user is authorized for

| Field | Value |
| --- | --- |
| **Statement** | Navigation answers are restricted to the menu items the user is authorized for. |
| **Trigger** | Any `NavigationContext` query |
| **Enforcement** | `NavigationContext.vb` |
| **Outcome** | Unauthorized menu items are invisible to the application. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-020: Application codes and menu category codes are loaded once and cached for the life of the process

| Field | Value |
| --- | --- |
| **Statement** | Application codes and menu category codes are loaded once and cached for the life of the process. |
| **Trigger** | First access to `ApplicationCodes` / `MenuCategories` |
| **Enforcement** | `NavigationContext.vb` (`GetApplicationCodes`, `GetMenuCategories`) |
| **Outcome** | Repeat lookups avoid additional database round trips; code changes require a recycle.* |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-021: When the current application path does not map to a known application code, navigation lookups return no item

| Field | Value |
| --- | --- |
| **Statement** | When the current application path does not map to a known application code, navigation lookups return no item. |
| **Trigger** | `ItemByAppPath` returns `Nothing` |
| **Enforcement** | `NavigationContext.vb` |
| **Outcome** | Callers get `Nothing` / `0` instead of a wrong item. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-022: Page and item lookups prefer an exact link match and fall back to a partial match

| Field | Value |
| --- | --- |
| **Statement** | Page and item lookups prefer an exact link match and fall back to a partial match. |
| **Trigger** | `GetCurrentItem`, `GetCurrentPage`, `GetItem` |
| **Enforcement** | `NavigationContext.vb` |
| **Outcome** | Query-string variants still resolve to the right menu item. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-023: `GetItem` with `inAnyApp = True` searches by category across all applications, ignoring the current application code

| Field | Value |
| --- | --- |
| **Statement** | `GetItem` with `inAnyApp = True` searches by category across all applications, ignoring the current application code. |
| **Trigger** | Caller passes `inAnyApp = True` |
| **Enforcement** | `NavigationContext.vb` (`GetItem`) |
| **Outcome** | Cross-application links can be resolved. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/NavigationContext.vb |

---

## BR-CORE-024: Outbound mail is sent through the legacy mail web service whose URL comes from the LegacyMailWebServiceUrl configuration setting

| Field | Value |
| --- | --- |
| **Statement** | Outbound mail is sent through the legacy mail web service whose URL comes from the `LegacyMailWebServiceUrl` configuration setting. |
| **Trigger** | Any `SendMail` / `SendMailWithAttachment` call |
| **Enforcement** | `clsMailMessage.vb` |
| **Outcome** | Mail routing is environment-configurable, not hard-coded. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsMailMessage.vb |

---

## BR-CORE-025: Recipient and subject text are sanitized before being placed in a `mailto:` URL

| Field | Value |
| --- | --- |
| **Statement** | Recipient and subject text are sanitized before being placed in a `mailto:` URL. |
| **Trigger** | `OpenEmailPopup` / `OpenEmailScriptManager` |
| **Enforcement** | `AppViewPageBase.aspx.vb` |
| **Outcome** | Characters that would break the URL are removed or escaped. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-026: A CC recipient is included in the `mailto:` link only when a non-empty CC value is supplied

| Field | Value |
| --- | --- |
| **Statement** | A CC recipient is included in the `mailto:` link only when a non-empty CC value is supplied. |
| **Trigger** | `OpenEmailScriptManager` CC overload |
| **Enforcement** | `AppViewPageBase.aspx.vb` |
| **Outcome** | No empty `cc=` parameter is emitted. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-027: Download content type is derived from the file extension: `.txt` → `text/plain`, `.csv` → `application/vnd.ms-excel`

| Field | Value |
| --- | --- |
| **Statement** | Download content type is derived from the file extension: `.txt` → `text/plain`, `.csv` → `application/vnd.ms-excel`. |
| **Trigger** | `StreamDownloadFile` |
| **Enforcement** | `clsMailMessage.vb` (`StreamDownloadFile`) |
| **Outcome** | Browsers handle the download correctly; other extensions get an empty content type.* |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsMailMessage.vb |

---

## BR-CORE-028: No focus script is emitted when the master page has no focus control

| Field | Value |
| --- | --- |
| **Statement** | No focus script is emitted when the master page has no focus control. |
| **Trigger** | Master `PreRender` |
| **Enforcement** | `AppViewMasterPageBase.vb` (`RenderClientScripts`) |
| **Outcome** | Pages without a designated focus control are unaffected. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewMasterPageBase.vb |

---

## BR-CORE-029: Client-side focus targeting is control-type specific, because Infragistics editors render nested input elements

| Field | Value |
| --- | --- |
| **Statement** | Client-side focus targeting is control-type specific, because Infragistics editors render nested input elements. |
| **Trigger** | `RegisterFocusControlScript` |
| **Enforcement** | `AppViewMasterPageBase.vb` |
| **Outcome** | Focus lands on the real input element rather than the wrapper. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewMasterPageBase.vb |

---

## BR-CORE-030: Focus is applied 100 ms after load inside a `try/catch`, so a missing element never breaks the page

| Field | Value |
| --- | --- |
| **Statement** | Focus is applied 100 ms after load inside a `try/catch`, so a missing element never breaks the page. |
| **Trigger** | `RegisterFocusControlScript` |
| **Enforcement** | `AppViewMasterPageBase.vb` |
| **Outcome** | Focus failures are silent. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewMasterPageBase.vb |

---

## BR-CORE-031: The `SAIFMenu` control's focus target is redirected to the `CVTextBox` context box

| Field | Value |
| --- | --- |
| **Statement** | The `SAIFMenu` control's focus target is redirected to the `CVTextBox` context box. |
| **Trigger** | `NavigationManager.BoundControlId` set to a `SAIFMenu` |
| **Enforcement** | `AppViewMasterPageBase.vb` (`NavigationManager`) |
| **Outcome** | Focus goes to the menu's context entry field. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewMasterPageBase.vb |

---

## 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`

| Field | Value |
| --- | --- |
| **Statement** | Drop-down lists may be pre-pended with a blank entry rendered as a literal blank, an empty string, or a space, per `DDLAddItems`. |
| **Trigger** | `LoadDDL` |
| **Enforcement** | `clsControlManager.vb` (`LoadDDL` overloads) |
| **Outcome** | "No selection" is representable in every list flavour. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-033: Grid scroll/begin-edit/focus behavior is implemented per Infragistics grid flavour (`UltraWebGrid`, `WebDataGrid`, `WebHierarchicalDataGrid`)

| Field | Value |
| --- | --- |
| **Statement** | Grid scroll/begin-edit/focus behavior is implemented per Infragistics grid flavour (`UltraWebGrid`, `WebDataGrid`, `WebHierarchicalDataGrid`). |
| **Trigger** | Corresponding helper call |
| **Enforcement** | `clsControlManager.vb` |
| **Outcome** | The correct client-side API is invoked for each grid type. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-034: Disabling a page disables every control it contains

| Field | Value |
| --- | --- |
| **Statement** | Disabling a page disables every control it contains. |
| **Trigger** | `EnablePageControl(Page, False)` |
| **Enforcement** | `clsControlManager.vb` (`EnablePageControl`) |
| **Outcome** | Whole-screen read-only mode. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsControlManager.vb |

---

## BR-CORE-035: The root master page is the first ancestor master with no parent master

| Field | Value |
| --- | --- |
| **Statement** | The root master page is the first ancestor master with no parent master. |
| **Trigger** | `MasterLevelCount` / `Root` |
| **Enforcement** | `clsNestedMaster.vb` |
| **Outcome** | Nested master hierarchies resolve deterministically. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsNestedMaster.vb |

---

## BR-CORE-036: Control search within nested masters is scoped to the named content placeholder when one is supplied

| Field | Value |
| --- | --- |
| **Statement** | Control search within nested masters is scoped to the named content placeholder when one is supplied. |
| **Trigger** | `FindControl` with `contentPlaceHolderID` |
| **Enforcement** | `clsNestedMaster.vb` (`RecurseFindControl`) |
| **Outcome** | The right control is found in the right region. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsNestedMaster.vb |

---

## BR-CORE-037: If the recursive nested search finds nothing, a direct `FindControl` on the root master is attempted

| Field | Value |
| --- | --- |
| **Statement** | If the recursive nested search finds nothing, a direct `FindControl` on the root master is attempted. |
| **Trigger** | `FindControl` recursion returns `Nothing` |
| **Enforcement** | `clsNestedMaster.vb` (`FindControl`) |
| **Outcome** | Controls declared directly on the root master are still found. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsNestedMaster.vb |

---

## BR-CORE-038: Menu context is only validated on postbacks and only when the menu control supplied a value

| Field | Value |
| --- | --- |
| **Statement** | Menu context is only validated on postbacks and only when the menu control supplied a value. |
| **Trigger** | `IsValidNumericMenuContext` |
| **Enforcement** | `clsAppControllerBase.vb` |
| **Outcome** | Initial GET requests never carry menu context. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsAppControllerBase.vb |

---

## BR-CORE-039: A numeric menu context is valid only when it is numeric and greater than "0"

| Field | Value |
| --- | --- |
| **Statement** | A numeric menu context is valid only when it is numeric and greater than `"0"`. |
| **Trigger** | `IsValidNumericMenuContext` |
| **Enforcement** | `clsAppControllerBase.vb` |
| **Outcome** | Zero/blank context values are rejected. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsAppControllerBase.vb |

---

## BR-CORE-040: Known Word-originated characters (smart quotes, bullets, tabs) are normalized before text leaves the application

| Field | Value |
| --- | --- |
| **Statement** | Known Word-originated characters (smart quotes, bullets, tabs) are normalized before text leaves the application. |
| **Trigger** | `CleanString` |
| **Enforcement** | `clsStringUtilities.vb` |
| **Outcome** | Downstream mail and reporting do not fail on pasted Word content. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsStringUtilities.vb |

---

## BR-CORE-041: Only printable ASCII (32–126) plus CR and LF survive `CleanString`; all other characters become spaces

| Field | Value |
| --- | --- |
| **Statement** | Only printable ASCII (32–126) plus CR and LF survive `CleanString`; all other characters become spaces. |
| **Trigger** | `CleanString` |
| **Enforcement** | `clsStringUtilities.vb` |
| **Outcome** | Unprintable characters cannot reach e-mail or Crystal Reports. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsStringUtilities.vb |

---

## BR-CORE-042: `mailto:` text has `"` → `'`, `#` and `?` removed, `&` → `and`, and CRLF/tab URL-encoded

| Field | Value |
| --- | --- |
| **Statement** | `mailto:` text has `"` → `'`, `#` and `?` removed, `&` → `and`, and CRLF/tab URL-encoded. |
| **Trigger** | `CleanForEmail` |
| **Enforcement** | `clsStringUtilities.vb` |
| **Outcome** | The `mailto:` URL parses correctly in the browser. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/clsStringUtilities.vb |

---

## BR-CORE-043: `HelpFolderName` must be set (normally in the descendant's `Configure` method) before any help URL is requested

| Field | Value |
| --- | --- |
| **Statement** | `HelpFolderName` must be set (normally in the descendant's `Configure` method) before any help URL is requested. |
| **Trigger** | `HelpFolderName` getter with a null backing field |
| **Enforcement** | `AppViewPageBase.aspx.vb` |
| **Outcome** | An `ApplicationException` is thrown with an explanatory message. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-044: Help URLs default to `/help/<HelpFolderName>/Help_Body.html`, `…/Help_Header.html` and `…/Help_TOC.html`

| Field | Value |
| --- | --- |
| **Statement** | Help URLs default to `/help/<HelpFolderName>/Help_Body.html`, `…/Help_Header.html` and `…/Help_TOC.html`. |
| **Trigger** | `HelpBody` / `HelpHeader` / `HelpTOC` getters with no explicit value |
| **Enforcement** | `AppViewPageBase.aspx.vb` |
| **Outcome** | Consistent help file layout across applications. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-045: A help bookmark supplied as `page#anchor` splits into body page and anchor; a bare value is treated as the anchor on the current body page

| Field | Value |
| --- | --- |
| **Statement** | A help bookmark supplied as `page#anchor` splits into body page and anchor; a bare value is treated as the anchor on the current body page. |
| **Trigger** | `HelpBookmark` setter |
| **Enforcement** | `AppViewPageBase.aspx.vb` |
| **Outcome** | Deep links into help content work from a single property. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## BR-CORE-046: Every descendant page must implement `Configure(inSAIFMenu, inSAIFTopMenu)`

| Field | Value |
| --- | --- |
| **Statement** | Every descendant page must implement `Configure(inSAIFMenu, inSAIFTopMenu)`. |
| **Trigger** | Compilation of a descendant of `AppViewPageBase` |
| **Enforcement** | `AppViewPageBase.aspx.vb` (`MustOverride Configure`) |
| **Outcome** | Menus are always configured by the page. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics111/AppViewPageBase.aspx.vb |

---

## Notes
- Mark inferred statements with `*` and unknown statements with `**`. Do not use bold inline confidence labels.
- No inherited business rules were identified for this library: `clsControllerBase` and `clsModelBase` (the base classes of `clsAppControllerBase` / `clsAppModelBase`) were not resolved through the Legends CLI RAG service for this run, so no `INH-` prefixed rules are included.

> **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.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.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`
