# AU2 Multiple validation controllers

**URL:** <https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591>\
**Category:** Help Requests\
**Created:** [February 8, 2026, 2:17pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591 "2026-02-08T14:17:30Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![elitemike](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/elitemike/32/690_2.png) [@elitemike](https://discourse.aurelia.io/u/elitemike)\
**Post date:** [February 8, 2026, 2:17pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/1 "2026-02-08T14:17:30Z")

</div>

UPDATE: I may have figured it out but can’t test thoroughly right now.

Working through my form builder migration and I hit a spot that is stumping me. I have a control that I call a List Builder, and it utilizes a collection/list control to hold an array of custom objects. The object structure is defined by a 3rd party. A custom form can be designed using the same form layout components as the form builder with a few exceptions such as not allowing a nested list builder. I’m sure I am doing something stupid here.

The issue I’m running into is with the 2 validation controllers. There is a primary validation controller that resides on the class that handles the form and it is setup like this. This is my “global” validator

```auto
private validationController: IValidationController = resolve(newInstanceForScope(IValidationController));

```

When list builder control is instantiating, a new validator controller is needed only for this form control and is instantiated like this. I keep a named collection so that I can easily look them up by the form control Id.

```auto
 validationController = {
                    name: validatorName,
                    validationController: this.container.get(newInstanceOf(IValidationController)) as any 
                };

```

The form looks like this rendered, ignore the layout, this is early in my migration so I was just trying to get adding/removing items working.

 ![image](https://canada1.discourse-cdn.com/flex027/uploads/aurelia/original/2X/b/bac233364773d710a446d0f030601dd56e519246.png)  
When Clicking ‘Add’ the validation controller gets called

```auto
   let controller = this.controlFactory.getValidationController(this.id);
        const result = await controller.validate();

```

During debug inspection, I can see the objects on that controller are the 5 form elements defined for that form

 ![image](https://canada1.discourse-cdn.com/flex027/uploads/aurelia/original/2X/4/45c3f1fb70117beb3df1c89ef29aca3886835c67.png)

The one I instantiate as global only has the listbuilder control as it should.

 ![image](https://canada1.discourse-cdn.com/flex027/uploads/aurelia/original/2X/b/b3c71f924cae534b832e068d551a1499a5bac1f3.png)

When I actually call validate, it is validating both controllers. item 6 and 7 are defined on the global controller.

 ![image](https://canada1.discourse-cdn.com/flex027/uploads/aurelia/original/2X/a/a37e3fd4407b427fd2c76e93de2338006ca1762f.png)

---

<div class="post-metadata">

**Author:** ![Sayan751](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/sayan751/32/1861_2.png) [@Sayan751](https://discourse.aurelia.io/u/Sayan751)\
**Post date:** [February 9, 2026, 4:20pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/2 "2026-02-09T16:20:46Z")

</div>

Hi @elitemike! Without seeing much code, my assumption is that the rules are defined on a shared object, and as the `.validate()` does not provide an explicit instruction on what to validate, the rule discovery infra validates all rules for all registered objects. It would be easier to troubleshoot if you could share a minimal reproduction.

---

<div class="post-metadata">

**Author:** ![elitemike](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/elitemike/32/690_2.png) [@elitemike](https://discourse.aurelia.io/u/elitemike)\
**Post date:** [February 11, 2026, 1:39pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/3 "2026-02-11T13:39:42Z")

</div>

I still haven’t had a chance to revisit this project, but saw that you replied and didn’t want to ignore you.

I think what the issue was/is the position of the .on(object) in the rule. In au1 it was at the end and I forgot to update this control due to the timespan between me working on this project. I also switched the ensure to be an arrow function expression which I doubt makes a difference.

---

<div class="post-metadata">

**Author:** ![Sayan751](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/sayan751/32/1861_2.png) [@Sayan751](https://discourse.aurelia.io/u/Sayan751)\
**Post date:** [February 11, 2026, 6:53pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/4 "2026-02-11T18:53:42Z")

</div>

The arrow function to specify the properties should not make any difference other than type-checking. The `.on(object)` need to be before specifying any rule though.

---

<div class="post-metadata">

**Author:** ![elitemike](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/elitemike/32/690_2.png) [@elitemike](https://discourse.aurelia.io/u/elitemike)\
**Post date:** [February 12, 2026, 1:07pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/5 "2026-02-12T13:07:53Z")

</div>

Might be a good idea to call that out in the migration guide. AU1 allowed this. The AU1 docs show it at the end. I’m assuming for most people it won’t cause any issues.

---

<div class="post-metadata">

**Author:** ![Sayan751](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/sayan751/32/1861_2.png) [@Sayan751](https://discourse.aurelia.io/u/Sayan751)\
**Post date:** [February 12, 2026, 8:23pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/6 "2026-02-12T20:23:38Z")

</div>

The migration guide already mentions this: [Migration Guide & Breaking Changes | The Aurelia 2 Docs](https://docs.aurelia.io/aurelia-packages/validation/migration-guide) 🙂

---

<div class="post-metadata">

**Author:** ![elitemike](https://yyz1.discourse-cdn.com/flex027/user_avatar/discourse.aurelia.io/elitemike/32/690_2.png) [@elitemike](https://discourse.aurelia.io/u/elitemike)\
**Post date:** [February 12, 2026, 9:05pm UTC](https://discourse.aurelia.io/t/au2-multiple-validation-controllers/6591/7 "2026-02-12T21:05:45Z")

</div>

Alright, so this is just my .02 this [Migrating to Aurelia 2 | The Aurelia 2 Docs](https://docs.aurelia.io/migrating-to-aurelia-2/migrating-to-aurelia-2) should probably be combined with the breaking changes. I went there first before commenting lol
