Generative Pages: Link Them to Your Model-Driven App Forms

An animated GIF showing a Power Apps interface for “NFL Players Dynasty Rankings.” Opening up Player Details of Drake May in a Dialog

I’ve been hands‑on with Generative Pages in Model‑Driven Power Apps. Short version: you get results fast. And when you already know Dataverse and the client APIs, they get really good, really quickly. Microsoft’s goal is simple, describe a page, pick your tables, and let AI generate React code plus the wiring. You will then refine in a conversation and ship. No Power Fx layer, but direct code generation. That matters for performance and iteration speed.

I put it to work on something fun: my Fantasy Football tracker. One table with all relevant NFL players. I wanted a richer list experience than a default view. Filters, quick access, and a detail peek without kicking the user out of flow.

So I built a Generative Page.

A screenshot of a web application titled “NFL Players Dynasty Rankings” within Power Apps. The page displays a table with columns: KTC Overall, Player Name, Age, Team, Position, KTC Value, and KTC Pos Rank. The table lists players such as Drake Maye, Josh Allen, Bijan Robinson, and others, along with their teams, positions (e.g., QB, RB, WR, TE), and numeric rankings. The interface includes filters for positions (QB, RB, WR, TE), checkboxes for “Rookies Only” and “Show Picks,” and pagination controls at the bottom.
Full Generative Page of NFL Players

It took me minutes to get a decent page looking page. Especially when I asked it to look like a Model-Driven App, it immediately applied Fluint Ui. Then I nudged it with prompts and a bit of platform knowledge to make it just the way I want it.

Learning #1 — Link the player name to the Main Form

Now that I have a list of NFL Players, I want to be able to click on them for more details or to edit it. You can ask the Generative Page functionality to wire something up, but I want a different route. As we are in a Model-Driven App, I want to mix and match best of both worlds. I want to use the Main Form of the NFL Player.

Prompt I used:

“I want to create a hyperlink on the player name to the Main Form of the NFL Player table.”

The agent generated the list, wired the click, and opened the record. Excellent start, I was surprised it worked as advertised, Generative Pages let you describe the intent and bind to Dataverse tables right inside the designer.

A screenshot of a chat interface with a user message in a pink box stating: “I want to create a hyperlink on the player name to the Main Form of the NFL Player table.” Below, an App Agent response says: “Sure! I’ll start by planning the structure of your page, and then I’ll generate the code to bring it to life.” The interface includes collapsible sections labeled “Agent Thoughts,” “Summary,” and “Restore,” along with thumbs up and thumbs down icons at the bottom.
Prompt for a Hyperlink to Form

But… it opened in a new tab. I wanted a modal. Inline to avoid context switch.

Learning #2 — Teach the agent a better API

Then I asked:

“Can we open the form as a modal instead?”

This did not work at all. So I peeked at the generated code and saw that it leaned on Xrm.Navigation.openForm. That explains the new tab. “openForm” is designed to open entity forms (and quick creates), and it explicitly points you to navigateTo when you need a main form in a dialog. Yes, the docs literally say: “To open a main form as a dialog, use the navigateTo method instead.”

So I told the agent:

“You cannot open the form as a dialog with the openForm method. Use Xrm.Navigation.navigateTo. A dialog mimics my requirement of a modal better.”

That single correction changed the UX completely.

A screenshot of a chat interface with a user message in a pink box stating: “You cannot open the form as a dialog with the openform method. You have to use Xrm.Navigation.navigateTo. A dialog would mimic my requirement of a modal better.” Below, the App Agent responds: “Sure! I’ll start by planning the structure of your page, and then I’ll generate the code to bring it to life.” The response includes a section titled “Step 1: Requirements Analysis,” explaining that the user wants to change how the NFL Player form opens, replacing Xrm.Navigation.openForm with Xrm.Navigation.navigateTo for modal dialog behavior.
Prompt for the Form as Dialog
A screenshot of a text-based interface showing steps for code changes. Step 2 is titled “Existing Code Review” and explains that the current code uses handleOpenForm to call Xrm.Navigation.openForm, passing entityName and entityId, and sets target: 2 for modal, which is incorrect. Step 3 is titled “Required Changes” and lists instructions to replace openForm with Xrm.Navigation.navigateTo, specifying pageInput and navigationOptions objects with details like pageType: "entityrecord", entityName: "cr668_nflplayer", entityId: id, and modal size (e.g., 800x600).
2nd part of the Prompt Answer

Xrm.Navigation.navigateTo supports opening entity records and custom pages as dialogs, with options for target, position, width/height, and a success callback when the dialog closes.

If you’ve never used it for modals, the pattern looks like this:


// Open the NFL Player main form as a modal dialog
Xrm.Navigation.navigateTo(
  {
    pageType: "entityrecord",
    entityName: "new_nflplayer",   // logical name
    entityId: playerIdGuid         // open existing record
    // formId: "optional-form-guid" // pick a specific form if you need it
  },
  {
    target: 2,                     // 2 = dialog
    position: 1,                   // 1 = center, 2 = side
    width: { value: 50, unit: "%" },
    height: { value: 80, unit: "%" },
    title: "Player Details"
  }
).then(
  function () { /* code after dialog closes */ },
  function (error) { console.error(error); }
);

Microsoft shows similar options in the client API docs, and plenty of community examples demonstrate dialogs with navigateTo.

Why I’m bullish on Generative Pages

Generative Pages get you 70% there in minutes. Another 20% comes from creativity, and the last 10% is where platform knowledge pays off.

  • You know which API gives you the UX you want (navigateTo vs. openForm).
  • You can shape prompts with the right terms: “modal,” “dialog,” “open inline,” “not a new tab.”
  • You can read the generated code and nudge it to better practices (e.g., avoiding full‑page navigation for details).

This is exactly the maker‑plus‑AI loop I like: the agent scaffolds, you guide.

And yes, Generative Pages and the broader Platform are still evolving. Generative Pages are scoped to model‑driven apps, with a dedicated experience in the app designer and an AI agent that generates React. You iterate conversationally and publish pages individually. That’s fine. The speed trade‑off is worth it for many scenarios.

Will I keep building Custom Pages?

Probably not.

Generative Pages cover what I used Custom Pages for, bespoke UI, rich experience, inline actions, and a modern UX. But then with less friction, more flexibility and faster iteration. The key is to link your Generative Page to your Model‑Driven App and make the app experience complementary. That gives you the same “canvas‑style” experience inside a model‑driven app, minus the overhead of designing and building a Custom Page.

For the Fantasy Football app, the Generative Page won: prompt → list UI → link → modal. Done. It’s the experience I want.

The Future Is Generative

Generative Pages aren’t just a shortcut, they are a shift in how we build apps. Instead of hand‑crafting every pixel or wiring every event, we describe intent and let AI scaffold the experience. Then we refine with platform knowledge.

This is the new maker loop: prompt → generate → guide → ship. It’s faster, more flexible, and closer to how modern development will feel across the Power Platform.

Custom Pages? They’ll still exist for edge cases. But for most scenarios, Generative Pages will become the default.