Model-Driven App Forms: Customization Patterns That Scale
Model-driven forms start clean and become slow when every team adds a tab, subgrid, script, and business rule without an operating model. The form is where users judge the app, so customization quality is not cosmetic. A scalable form design makes the common path fast, the important data obvious, and the special cases available without punishing everyone.
Main forms should tell a story through tabs and sections
A main form is not a database schema viewer. It is a task surface. Tabs should represent meaningful work areas such as summary, qualification, billing, service history, or compliance. Sections should group fields users think about together. Columns should create readable density without hiding important values below the fold.
Start with the first thirty seconds of user intent. What must the user know immediately when opening the record? Put that in the first tab, preferably above heavy components. Move secondary history, analytics, and related records into later tabs. Users can navigate to detail; they should not pay the load cost every time.
Use tabs as performance boundaries. A collapsed or later tab can delay expensive components. This is not a substitute for good design, but it helps keep the initial experience responsive.
Use sections for scanability. A form with twenty fields in one block is technically organized and practically hostile.
Avoid hiding required context. If a value drives process decisions, do not bury it on an administrative tab just because it is owned by another team.
Form types solve different jobs
Dataverse gives you several form types, and using the wrong one creates unnecessary customization. Main forms support full record work. Quick create forms support fast entry with minimal fields. Quick view forms show related record data without copying it. Card forms support compact presentations in specific controls.
| Form type | Best use | Design rule | Common mistake |
|---|---|---|---|
| Main | Full record lifecycle | Optimize first tab for daily work | Adding every related grid |
| Quick create | Fast capture | Only ask for required decisions | Turning it into a mini main form |
| Quick view | Related record visibility | Show stable reference data | Expecting full interaction |
| Card | Compact record display | Keep it glanceable | Overloading with fields |
Quick create forms are especially easy to abuse. If users need twenty fields to create the record, the process may not be quick create. If only five fields are required now and the rest can be completed later, quick create is perfect.
Business rules and form scripts should have clear ownership
Business rules are ideal for simple field behavior: required fields, visibility, defaulting, and validation that functional owners can understand. They should be your first option for obvious logic. Form scripts are for richer client-side behavior, such as filtering lookups, setting form notifications, or coordinating UI state across controls.
The boundary is truth. If the rule must apply to imports, integrations, and background updates, do not leave it only in a form script. Use server-side validation through table-scoped business rules, low-code plug-ins, or C# plug-ins as appropriate. Let the form script improve the user experience, not define the data contract.
function onLoad(executionContext) {
const formContext = executionContext.getFormContext();
const account = formContext.getAttribute("parentcustomerid")?.getValue();
if (!account || account.length === 0) {
formContext.ui.setFormNotification(
"Select a customer before adding billing details.",
"INFO",
"missing-customer"
);
return;
}
formContext.ui.clearFormNotification("missing-customer");
}
Keep JavaScript modules small and event-specific. Register only the handlers needed for the form. Avoid global libraries that run logic for every table because they are convenient to deploy.
Quick view forms prevent duplication when used honestly
Quick view forms are one of the cleanest ways to show related data. If a case needs to display account segment, credit status, or support tier, a quick view can show the account fields without copying them to the case. That reduces synchronization logic and keeps ownership clear.
Use quick views for reference context. The data remains owned by the related record, and the user gets visibility where they work. Do not use quick views as a workaround for process data that really belongs on the current table. If case routing depends on account tier at the time the case is created, you may need to snapshot the value intentionally.
Be careful with chains. A form that loads quick views, which load related forms, plus several subgrids, plus JavaScript calls, can become slow and hard to reason about. Each component has a cost even when the screen looks simple.
Performance is designed by removing work
Model-driven form performance is usually improved by doing less at load time. Minimize synchronous scripts. Avoid calling APIs on onLoad unless the data is essential. Do not load heavy subgrids on the first tab just because stakeholders like seeing everything in one place. Use views, dashboards, and related tabs for exploratory data.
Form performance checklist:
- Keep the first tab focused on common decisions.
- Move heavy subgrids to later tabs.
- Register scripts only on forms that need them.
- Avoid synchronous network calls during onLoad.
- Prefer quick views over copied fields for reference context.
- Remove unused controls, hidden fields, and dead business rules.
Also review dependencies after each release. Forms accumulate invisible weight: old fields hidden by business rules, scripts left registered after requirements changed, and web resources loaded for controls that no longer exist. Cleanup is performance work.
Multiple forms need a governance model
Multiple main forms are useful when different roles have genuinely different jobs. Sales, service, finance, and compliance users may need different layouts for the same table. Form order and security roles control which form opens by default and who can access each form.
Do not create multiple forms just to avoid making a hard design decision. Every additional form increases testing, script registration, business rule scope review, and documentation. If the difference is a few fields, consider role-based visibility or sections instead. If the workflow is genuinely different, separate forms can be cleaner.
Name forms by audience and purpose. “Account Sales Main” is better than “Account Main New”.
Test with real roles. Administrators see everything and hide mistakes. Validate form order and security with representative users.
Align scripts to forms. A script written for the sales form should not assume controls exist on the service form.
{
"table": "account",
"forms": [
{
"name": "Account Sales Main",
"audience": "sales",
"firstTab": "summary"
},
{
"name": "Account Service Main",
"audience": "service",
"firstTab": "support-profile"
}
]
}
Scalable forms are intentionally boring
The best model-driven forms do not show off every platform feature. They put common work first, push heavy data out of the initial path, use business rules for simple behavior, use JavaScript only where the client needs it, and keep server-side truth outside the browser. Quick views reduce duplication, quick create forms accelerate capture, and multiple main forms serve real role differences.
A scalable form is easy to open, easy to scan, and easy to support after three more teams add requirements. That is the standard: not the most customized form, but the one that keeps its shape as the app grows.
Keep reading
Dual-Write vs Virtual Entities vs OData: Choosing the Right F&O–Dataverse Pattern
Compare dual-write, virtual entities, OData, and DMF for Finance and Operations to Dataverse integration with latency and failure tradeoffs.
Low-Code Plug-ins in Dataverse: Server-Side Logic Without C#
Learn when to use Dataverse low-code plug-ins with Power Fx for transactional server-side logic, and when C# plug-ins or flows still win.
Writing Your First Dataverse Plug-in in C#: A Complete Walkthrough
Build a first Dataverse C# plug-in with IPlugin, pipeline stages, Target handling, tracing, registration, and production-safe practices.
Newsletter
New posts, straight to your inbox
One email per post. No spam, no tracking pixels, unsubscribe anytime.
Comments
No comments yet. Be the first.