Sunday, 11 January 2026

Binding Pre-Search on Lookup Fields in Model-Driven Apps Using TypeScript

The Problem

Developers often need to filter lookup fields dynamically in Microsoft Power Apps model-driven forms. The challenge is binding a pre-search event to a lookup control using TypeScript with strong typing, ensuring maintainability and avoiding the use of 'any'.

Prerequisites

  • Node.js v20+
  • TypeScript 5+
  • @types/xrm installed for strong typing
  • Power Apps environment with a model-driven app
  • Appropriate security roles: System Customizer or equivalent with form customization privileges

The Solution (Step-by-Step)

1. Add TypeScript Reference

// Add Xrm type definitions at the top of your file
/// 

2. Implement the Pre-Search Binding

// Function to bind pre-search event on a lookup field
function addPreSearchToLookup(executionContext: Xrm.Events.EventContext): void {
    const formContext = executionContext.getFormContext();

    // Get the lookup control by name
    const lookupControl = formContext.getControl("new_lookupfield");

    if (lookupControl) {
        // Add pre-search event handler
        lookupControl.addPreSearch(() => {
            // Define custom filter XML
            const filterXml = "";

            // Apply the filter to the lookup
            lookupControl.addCustomFilter(filterXml, "entitylogicalname");
        });
    }
}

// Register this function on the form's OnLoad event in the form editor

Explanation:

  • We use addPreSearch to inject a custom filter before the lookup search executes.
  • Strong typing is enforced using Xrm.Controls.LookupControl.
  • No 'any' type is used, ensuring type safety.

Best Practices & Security

  • Type Safety: Always use @types/xrm for strong typing and avoid 'any'.
  • Security Roles: Ensure users have roles like System Customizer or App Maker to customize forms.
  • Principle of Least Privilege: Assign only necessary roles to users who manage form scripts.
  • Deployment Automation: Use Power Platform CLI or Azure DevOps pipelines for ALM. For IaC, consider Azure Bicep to manage environment configurations.
  • Testing: Test the pre-search logic in a sandbox environment before deploying to production.

Pro-Tip: Use lookupControl.addCustomFilter() with specific entity names to avoid applying filters globally, which can cause unexpected behavior.

Summary

  • Bind pre-search events using addPreSearch for dynamic lookup filtering.
  • Enforce strong typing with @types/xrm and avoid 'any'.
  • Secure and automate deployments using Power Platform CLI and Azure IaC tools.

No comments:

Post a Comment