Skip to content

Support ContentPlaceHolder inside CompositeControl templates (deferred master page composition)#2017

Open
Copilot wants to merge 9 commits into
mainfrom
copilot/support-contentplaceholders-in-templates
Open

Support ContentPlaceHolder inside CompositeControl templates (deferred master page composition)#2017
Copilot wants to merge 9 commits into
mainfrom
copilot/support-contentplaceholders-in-templates

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 12, 2026

ContentPlaceHolder couldn't be used inside CompositeControl templates because GetContents runs in the Load phase, after master page composition (which runs during BuildView, before Init).

Changes

Framework

  • DefaultDotvvmViewBuilder: Instead of throwing immediately when a ContentPlaceHolder ID is not found during PerformMasterPageComposition, unmatched Content controls are deferred into a shared List<PendingMasterPageComposition> stored on the root DotvvmView. Before deferring, the master page's ControlBuilderDescriptor.ContentPlaceHolderIds is checked — if the ID is not declared anywhere in the master page (including inside templates), an exception is thrown immediately at build time with a clear error message.

  • ContentPlaceHolder.OnInit: Added ResolvePendingComposition() — when a ContentPlaceHolder is added to the tree (including as a missed lifecycle event during Load or PreRender), it traverses ancestors to find the pending list and performs the deferred composition. Uses FindLastIndex so that when the same ContentPlaceHolderID is reused at multiple master page levels, each placeholder correctly matches its corresponding content (outermost placeholder ↔ outermost content). Throws a descriptive exception if the same ID is resolved a second time (e.g. ContentPlaceHolder placed inside a Repeater with more than one item).

  • DotvvmPresenter: ValidateMasterPageComposition() is called after both the Load phase (for postback/command requests, where Repeater creates children in OnLoad) and after the PreRender phase (for GET requests, where Repeater creates children in OnPreRender). If any deferred Content controls remain unmatched at that point (e.g. a Repeater with zero items), a descriptive exception is thrown.

  • ControlBuilderDescriptor: Added ContentPlaceHolderIds (ImmutableArray<string>) — populated at compile time by traversing the full resolved tree, including controls nested inside CompositeControl template properties. Used by the view builder to validate deferred compositions before they are queued.

  • Internal: Added PendingMasterPageCompositionsProperty, PendingMasterPageComposition (holds the Content, its DataContextStack, and master page file for error messages), and ResolvedMasterPageCompositionIdsProperty (HashSet<string>) which tracks which placeholder IDs have already been resolved to detect duplicate instantiation.

Usage Example

{{!-- Root.dotmaster --}}
<cc:TemplateContainerControl>
    <ContentTemplate>
        <dot:ContentPlaceHolder ID="MainContent" />  {{!-- now works inside templates --}}
    </ContentTemplate>
</cc:TemplateContainerControl>

Where TemplateContainerControl is a CompositeControl that instantiates the template in GetContents (Load phase).

Samples & Tests

  • Added LateContentPlaceHolders feature sample with a 3-level master page hierarchy (Root.dotmasterNested.dotmasterContent.dothtml) where each ContentPlaceHolder lives inside a CompositeControl template.
  • Added NestedSameId.dotmaster + SharedIdContent.dothtml — demonstrates and tests the case where the same ContentPlaceHolderID ("RootContent") is reused in both the root and the middle master page.
  • Added ContentWithDefault.dothtml — tests that when no Content is provided for a ContentPlaceHolder, its own default children are rendered.
  • Added MismatchedContent.dothtml — a content page with a Content whose ContentPlaceHolderID has no match anywhere, verifying the early build-time error is thrown.
  • Added RepeaterMaster.dotmaster + three content pages — tests ContentPlaceHolder inside a server-rendered Repeater: exactly 1 item works, 0 items throws (not found), and more than 1 item throws (duplicate composition).
  • Added AuthViewMaster.dotmaster + AuthViewContent.dothtml — demonstrates and tests that the same ContentPlaceHolderID in both AuthenticatedTemplate and NotAuthenticatedTemplate of AuthenticatedView works correctly because only one template is instantiated per request.
  • All Selenium tests are in LateContentPlaceHoldersTests.

Copilot AI and others added 2 commits April 12, 2026 14:25
…ster page composition)

Agent-Logs-Url: https://github.com/riganti/dotvvm/sessions/ca479579-7532-44bd-96e4-d8638c2d5130

Co-authored-by: tomasherceg <5599524+tomasherceg@users.noreply.github.com>
Agent-Logs-Url: https://github.com/riganti/dotvvm/sessions/ca479579-7532-44bd-96e4-d8638c2d5130

Co-authored-by: tomasherceg <5599524+tomasherceg@users.noreply.github.com>
Copilot AI changed the title [WIP] Allow ContentPlaceHolder usage in templates for master pages Support ContentPlaceHolder inside CompositeControl templates (deferred master page composition) Apr 12, 2026
Copilot AI requested a review from tomasherceg April 12, 2026 14:31
Comment thread src/Framework/Framework/Controls/ContentPlaceHolder.cs Fixed
tomasherceg and others added 2 commits April 12, 2026 17:03
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
@tomasherceg
Copy link
Copy Markdown
Member

I fixed some build errors.
@copilot Can you add another sample that would use the same ContentPlaceHolderId in the root and in the middle master page?
Also, we should test the case that if no content is specified for a ContentPlaceHolder, its own content would be used as default.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 12, 2026

I fixed some build errors.
@copilot Can you add another sample that would use the same ContentPlaceHolderId in the root and in the middle master page?
Also, we should test the case that if no cont...

Done in commit c2ec3b6. Here's what was added:

Same ContentPlaceHolderID in root and nested master (NestedSameId.dotmaster + SharedIdContent.dothtml): Both Root.dotmaster and NestedSameId.dotmaster use ID="RootContent". The content page fills the innermost one.

This also required a bug fix: when the same ID appears at multiple levels, the pending list contains multiple entries with the same ID. The original FindIndex would pick the wrong (inner) entry for the outer placeholder. Changed to FindLastIndex so the outermost ContentPlaceHolder correctly matches the outermost Content (items are added inner-first, so the outermost is last).

Default content (ContentWithDefault.dothtml): Uses Nested.dotmaster but provides no Content for the NestedContent placeholder. Added default children to that placeholder in Nested.dotmaster (<p data-ui="default-nested-content">Default nested content</p>). The default content is rendered when no matching Content is found (the Children.Clear() only happens when a pending composition is matched).

Selenium tests added for both cases.

});
}

[Fact]
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot Move these tests to a separate class (LateContentPlaceHoldersTests) to keep the current convention.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in commit 84eb337. All four LateContentPlaceHolders tests have been moved to a new LateContentPlaceHoldersTests class in LateContentPlaceHoldersTests.cs, and MasterPageTests now contains only the original nested master pages test.

…rsTests class

Agent-Logs-Url: https://github.com/riganti/dotvvm/sessions/d304bd6d-2bdb-4b99-97c5-89777d4241b4

Co-authored-by: tomasherceg <5599524+tomasherceg@users.noreply.github.com>
@tomasherceg
Copy link
Copy Markdown
Member

@copilot We want to ensure that the Content will eventually be matched with ContentPlaceHolder. Therefore, the view compiler should gather all ContentPlaceHolder IDs and store them in something like Internal.ContentPlaceHolderIds property of the DotvvmView (even when the ContentPlaceHolder is in a template), and the ViewBuilder checks that if the control doesn't exist yet, the ID is declared somewhere in the page. Also, we need to ensure that the composition would not happen multiple times - for example, if someone uses ContentPlaceHolder in Repeater - that should throw an exception.

Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 22, 2026

@copilot We want to ensure that the Content will eventually be matched with ContentPlaceHolder. Therefore, the view compiler should gather all ContentPlaceHolder IDs and store them in something ...

Done in commit 981956c. Here's what was implemented:

ControlBuilderDescriptor.ContentPlaceHolderIds: The view compiler now collects all ContentPlaceHolder IDs from the resolved tree (including those inside CompositeControl templates via the ResolvedControlTreeVisitor traversal) and stores them as ImmutableArray<string> in the descriptor.

Early validation in DefaultDotvvmViewBuilder: Before deferring a Content control, the master page's ContentPlaceHolderIds is consulted. If the target ID isn't declared anywhere in the master page, an exception is thrown immediately at build time (before the request lifecycle runs) instead of after Load.

Duplicate-composition guard in ContentPlaceHolder.ResolvePendingComposition: Tracks which IDs have already been resolved in Internal.ResolvedMasterPageCompositionIdsProperty (a HashSet<string> on the root page). If the same ContentPlaceHolder ID is resolved a second time (e.g., inside a Repeater template), a descriptive DotvvmControlException is thrown.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
  • 1p7vsblobprodcus324.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED (dns block)
  • 2kmvsblobprodcus39.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/F7D2419353110B6F32053972B32A361D/missingpackages_workingdir --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 4m6vsblobprodcus384.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED (dns block)
  • pdfvsblobprodcus380.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED (dns block)
  • pe3vsblobprodcus354.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED (dns block)
  • yttvsblobprodcus357.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore src/Tests/DotVVM.Framework.Tests.csproj (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

@tomasherceg
Copy link
Copy Markdown
Member

@copilot Add tests for the scenarios we didn't cover:

  • ContentPlaceHolder in Repeater with exactly 1 data source item - should work
  • ContentPlaceHolder in Repeater with 0 datasource items - should not work - not found
  • ContentPlaceHolder in Repeater with >1 datasource items - should not work - duplicate
  • Two ContentPlaceHolders with the same Id in different templates of AuthenticatedView - should work because only one of them will be instantiated

Copy link
Copy Markdown
Contributor Author

Copilot AI commented May 22, 2026

@copilot Add tests for the scenarios we didn't cover:

  • ContentPlaceHolder in Repeater with exactly 1 data source item - should work
  • ContentPlaceHolder in Repeater with 0 datasource items - should...

Done in commit 4dfa92c. Here's what was added:

Repeater scenarios (RepeaterMaster.dotmaster with RenderSettings.Mode="Server" Repeater containing <dot:ContentPlaceHolder ID="RepeaterContent" />):

  • 1 item (RepeaterOneItem.dothtml): works — content is rendered once. Required moving ValidateMasterPageComposition to also run after PreRender (for GET requests, Repeater.SetChildren runs in OnPreRender, not OnLoad).
  • 0 items (RepeaterZeroItems.dothtml): throws after PreRender — ValidateMasterPageComposition catches the unresolved pending composition.
  • >1 items (RepeaterMultipleItems.dothtml): throws during PreRender — second ResolvePendingComposition call detects the duplicate via ResolvedMasterPageCompositionIdsProperty.

AuthenticatedView scenario (AuthViewMaster.dotmaster): same ID="AuthContent" in both <AuthenticatedTemplate> and <NotAuthenticatedTemplate>. Content page provides <dot:Content ContentPlaceHolderID="AuthContent">. Works correctly — only one template is instantiated per request, so the composition happens exactly once.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 0t3vsblobprodcus362.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • 1p7vsblobprodcus324.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • 1s1vsblobprodcus386.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • 2kmvsblobprodcus39.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/F7D2419353110B6F32053972B32A361D/missingpackages_workingdir --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 4m6vsblobprodcus384.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • cflvsblobprodcus383.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • jd4vsblobprodcus366.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • k0ivsblobprodcus356.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • k4kvsblobprodcus344.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • m6xvsblobprodcus342.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/Samples/Tests/Tests/DotVVM.Samples.Tests.csproj --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED ironmentView/Env/usr/share/dotnet/dotnet aPager/DataPager/usr/share/dotnet/sdk/10.0.300/MSBuild.dll eater/RouteLinkV/noautoresponse eater/RepeaterAs/nologo (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/Samples/Tests/CompletenessChecker/DotVVM.Samples.Tests.CompletenessChecker.csproj --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED HooksPath (dns block)
  • pdfvsblobprodcus380.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)
  • yttvsblobprodcus357.vsblob.vsassets.io
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/dotvvm/dotvvm/src/DotVVM.sln --packages /tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/tmp/codeql-scratch-bfcb369f5dc91785/dbs/csharp/working/emptyFakeDotnetRoot /p:AllowMissingPrunePackageData=true -s REDACTED -s REDACTED thtml entViewTest.dothshow tml fix.dothtml (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

@tomasherceg tomasherceg marked this pull request as ready for review May 22, 2026 13:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

<dot:ContentPlaceHolder> should be supported even inside templates

2 participants