---
title: SAIF.Presentation.Web.Core.Infragistics103 business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF Documentation Team
last_reviewed: 2026-08-17
library: SAIF.Presentation.Web.Core.Infragistics103
reference_type: package
---

# SAIF.Presentation.Web.Core.Infragistics103 business rules

This page captures business rules enforced by this library.

## BR-NC-001: Menu visibility is restricted to authorized items

| Field | Value |
| --- | --- |
| **Statement** | A user's navigable menu items are limited to those returned by the BOF menu-authorization lookup for that user*. |
| **Trigger** | `NavigationContext.New(inUser As String)` construction. |
| **Enforcement** | `NavigationContext.vb` — `New(inUser As String)` → `clsMenuAuthorizedItemCollection.GetMenuAuthorizedItems(m_DPI, inUser.Trim.ToUpper)` (actual authorization logic resides in `SAIF.Business.Menu`, out of scope for this analysis). |
| **Outcome** | `MenuAuthorizedItems` contains only the items the given user is authorized to see; downstream lookups (`GetItem`, `GetCurrentItem`, `IsMenuItem`) can only resolve items within this authorized set. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\NavigationContext.vb |

---

## BR-NC-002: Exact match is preferred over fallback match for menu resolution

| Field | Value |
| --- | --- |
| **Statement** | When resolving the current page's menu item, an exact (application code + category + link) match is attempted before falling back to a broader match. |
| **Trigger** | Calls to `NavigationContext.GetItem`, `GetCurrentItem`, or `GetCurrentPage`. |
| **Enforcement** | `NavigationContext.vb` — `GetItem`/`GetCurrentItem` first call `MenuAuthorizedItems.ItemExact(AppCode, Category, Link, True)`, then, only when that returns `Nothing`, call `MenuAuthorizedItems.Item(AppCode, Category, Link, True)`; `GetCurrentPage` follows the same pattern with `MenuAuthorizedItems.FindPageExact(AppCode, PageLink)` first, then `MenuAuthorizedItems.FindPage(AppCode, PageLink)` when that returns `Nothing`. |
| **Outcome** | The most specific match is returned when available; otherwise a looser match is returned; if the application code itself cannot be resolved, `Nothing` is returned without attempting any item lookup. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\NavigationContext.vb |

---

## BR-AVPB-001: Session keep-alive only applies to internal (non-external) clients

| Field | Value |
| --- | --- |
| **Statement** | The session-ping keep-alive script is only registered for internal (non-external) client sessions, and only when explicitly enabled. |
| **Trigger** | `Page_Load` on any `AppViewPageBase`-derived page (via `CallSessionPing`). |
| **Enforcement** | `AppViewPageBase.aspx.vb` — `CallSessionPing()`: `If EnableSessionPing Then` (outer gate) and, nested inside it, `If Not AppGlobal.EnvironmentService.IsClientExternal Then` (inner gate) before registering the keep-alive script. |
| **Outcome** | External client sessions are allowed to time out normally; internal sessions (with `EnableSessionPing = True`, the default) receive a periodic keep-alive script, provided a `SessionPing.aspx` page exists in the consuming application. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\AppViewPageBase.aspx.vb |

---

## BR-AVPB-002: Broken business rules are visually flagged on their bound grid cell

| Field | Value |
| --- | --- |
| **Statement** | When a grid-bound BOF business object fails validation, each of its broken rules is rendered as a CSS error highlight on the grid cell mapped to the rule's property. |
| **Trigger** | Explicit call to `AppViewPageBase.SetErrorColorInGrid` (typically after a save/validate action). |
| **Enforcement** | `AppViewPageBase.aspx.vb` — `SetErrorColorInGrid`: iterates `myObject.Rules.BrokenRules`, appends `" wgcerror"` to the matching column's cell `CssClass`. |
| **Outcome** | Invalid rows are visually distinguishable; if `inSetFocusOnFirstError` is `True`, the grid's active cell is set to the first broken-rule cell found; a column lookup failure for a given rule is silently skipped (`Try/Catch`). |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\AppViewPageBase.aspx.vb |

---

## BR-AVPB-003: HelpFolderName must be configured before any Help* property is used

| Field | Value |
| --- | --- |
| **Statement** | Accessing `HelpBody`, `HelpBookmark`, `HelpHeader`, or `HelpTOC` before `HelpFolderName` has been set is treated as a configuration error. |
| **Trigger** | Getter access to `HelpBody`/`HelpBookmark`/`HelpHeader`/`HelpTOC` (each internally reads `HelpFolderName`). |
| **Enforcement** | `AppViewPageBase.aspx.vb` — `HelpFolderName` getter: `If m_HelpFolderName Is Nothing Then Throw New ApplicationException("HelpFolderName is not set. This is normally set in the Ancestor Configure method.")`. |
| **Outcome** | An unhandled `ApplicationException` is thrown, surfacing a clear configuration-order defect to the developer/consuming page rather than silently returning an incomplete help path. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\AppViewPageBase.aspx.vb |

---

## BR-CMM-001: Only .txt and .csv extensions receive an explicit content type

| Field | Value |
| --- | --- |
| **Statement** | Streamed file downloads only set a specific HTTP `Content-Type` for `.txt` and `.csv` file extensions; all other extensions receive an empty content type. |
| **Trigger** | Call to `Utilities.clsMailMessage.StreamDownloadFile`. |
| **Enforcement** | `clsMailMessage.vb` — `Select Case sFileType.ToLower` with only `Case ".txt"` and `Case ".csv"` populating `sContentType`; `Case Else` leaves it empty. |
| **Outcome** | `.txt` streams as `text/plain`, `.csv` streams as `application/vnd.ms-excel`; any other extension is written to the response with no `Content-Type` header value set by this method. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\clsMailMessage.vb |

---

## BR-CM-001: WebCombo child controls are excluded from recursive enable/disable

| Field | Value |
| --- | --- |
| **Statement** | When recursively enabling or disabling a control tree, Infragistics `WebCombo` controls are treated as a leaf — their child controls are not individually walked/toggled. |
| **Trigger** | Call to `Utilities.clsControlManager.EnablePageControl(inCntrl, inEnable)` where a descendant control is of type `WebCombo`. |
| **Enforcement** | `clsControlManager.vb` — `EnablePageControl`: `Select Case inCntrl.GetType.Name / Case "WebCombo" ' Skip child controls for these types.`. |
| **Outcome** | `WebCombo` controls are enabled/disabled as a single unit (via `UnProtectItem`/`ProtectItem`) rather than having their internal child controls individually toggled, avoiding inconsistent internal combo-box state. |
| **Source** | SAIF.Presentation.Web.Core.Infragistics103\clsControlManager.vb |

---

## Inherited business rules

Members in this section document a business rule enforced by a base-framework type this library's `AppViewPageBase` extends. It is retrieved from `SAIF.Presentation.Web.MVC`'s own documentation and is listed here so this page's rule coverage is self-contained; see that library's [business rules page](../saif-presentation-web-mvc/business-rules.md#br-mvc-008-internal-address-classification) for further detail.

### INH-MVC-008: Internal-address classification (inherited from SAIF.Presentation.Web.MVC)

| Field | Value |
| --- | --- |
| **Statement** | A request is treated as originating "inside the client network" if the caller's host address matches `10.*`, `131.131.*.*`, or `127.0.0.1`.† |
| **Trigger** | Evaluated on every request via `clsControllerBase.IsInsideClient`, and consumed here via `AppGlobal.EnvironmentService.IsClientExternal` in `AppViewPageBase.CallSessionPing`.† |
| **Enforcement** | `clsControllerBase.IsInsideClient` (`Like` pattern match against `Request.UserHostAddress`) in `SAIF.Presentation.Web.MVC`; `AppViewPageBase.CallSessionPing` relies on the resulting internal/external classification as the inner gate for [BR-AVPB-001](#br-avpb-001-session-keep-alive-only-applies-to-internal-non-external-clients).† |
| **Outcome** | Internal callers are eligible for the session keep-alive script (subject to `EnableSessionPing`); external callers never receive it, regardless of `EnableSessionPing`.† |
| **Source** | SAIF.Presentation.Web.MVC\clsControllerBase.vb (via `SAIF.Presentation.Web.MVC` documentation) |

---

## Notes
- `ValidateData`/`WriteData` in `clsAppModelBase` are stub no-op overrides that always return `False`; concrete validation/write logic is expected to be supplied by descendant models in consuming applications and is not itself a business rule enforced by this library.
- `SendMail`/`SendMailWithAttachment` in `clsMailMessage` have no explicit `Return` statement in their observed bodies, so they effectively always return the default `False`*.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Configuration settings](configuration.md)
- [API reference](api/index.md)

> **Note:** Statements marked with `†` are derived from dependency library
> documentation via the Legends CLI. Statements marked with `*` were inferred
> from code structure or contextual evidence. Statements marked with `**` could
> not be confirmed; treat as unknown until verified.

## Sources
- SAIF.Presentation.Web.Core.Infragistics103\NavigationContext.vb
- SAIF.Presentation.Web.Core.Infragistics103\AppViewPageBase.aspx.vb
- SAIF.Presentation.Web.Core.Infragistics103\clsMailMessage.vb
- SAIF.Presentation.Web.Core.Infragistics103\clsControlManager.vb
- SAIF.Presentation.Web.Core.Infragistics103\clsAppModelBase.vb
- SAIF.Presentation.Web.MVC\clsControllerBase.vb (via `SAIF.Presentation.Web.MVC` documentation)
