Merge branch 'release/3.0' into merge/release/3.0-preview8-to-release/3.0

This commit is contained in:
Doug Bunting 2019-08-03 13:31:00 -07:00 committed by GitHub
commit 0dc822a6ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
410 changed files with 5482 additions and 5727 deletions

View File

@ -69,6 +69,11 @@ parameters:
installJdk: true installJdk: true
timeoutInMinutes: 180 timeoutInMinutes: 180
# We need longer than the default amount of 5 minutes to upload our logs/artifacts. (We currently take around 5 mins in the best case).
# This makes sure we have time to upload everything in the case of a build timeout - really important for investigating a build
# timeout due to test hangs.
cancelTimeoutInMinutes: 15
jobs: jobs:
- job: ${{ coalesce(parameters.jobName, parameters.agentOs) }} - job: ${{ coalesce(parameters.jobName, parameters.agentOs) }}
displayName: ${{ coalesce(parameters.jobDisplayName, parameters.agentOs) }} displayName: ${{ coalesce(parameters.jobDisplayName, parameters.agentOs) }}

View File

@ -101,7 +101,6 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Razor" ProjectPath="$(RepoRoot)src\Razor\Razor\src\Microsoft.AspNetCore.Razor.csproj" RefProjectPath="$(RepoRoot)src\Razor\Razor\ref\Microsoft.AspNetCore.Razor.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Razor" ProjectPath="$(RepoRoot)src\Razor\Razor\src\Microsoft.AspNetCore.Razor.csproj" RefProjectPath="$(RepoRoot)src\Razor\Razor\ref\Microsoft.AspNetCore.Razor.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Abstractions" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Abstractions\src\Microsoft.AspNetCore.Mvc.Abstractions.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Abstractions\ref\Microsoft.AspNetCore.Mvc.Abstractions.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Abstractions" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Abstractions\src\Microsoft.AspNetCore.Mvc.Abstractions.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Abstractions\ref\Microsoft.AspNetCore.Mvc.Abstractions.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.ApiExplorer" ProjectPath="$(RepoRoot)src\Mvc\Mvc.ApiExplorer\src\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.ApiExplorer\ref\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.ApiExplorer" ProjectPath="$(RepoRoot)src\Mvc\Mvc.ApiExplorer\src\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.ApiExplorer\ref\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Components.Prerendering" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Components.Prerendering\src\Microsoft.AspNetCore.Mvc.Components.Prerendering.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Components.Prerendering\ref\Microsoft.AspNetCore.Mvc.Components.Prerendering.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Core" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Core\src\Microsoft.AspNetCore.Mvc.Core.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Core\ref\Microsoft.AspNetCore.Mvc.Core.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Core" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Core\src\Microsoft.AspNetCore.Mvc.Core.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Core\ref\Microsoft.AspNetCore.Mvc.Core.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Cors" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Cors\src\Microsoft.AspNetCore.Mvc.Cors.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Cors\ref\Microsoft.AspNetCore.Mvc.Cors.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Cors" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Cors\src\Microsoft.AspNetCore.Mvc.Cors.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.Cors\ref\Microsoft.AspNetCore.Mvc.Cors.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.DataAnnotations" ProjectPath="$(RepoRoot)src\Mvc\Mvc.DataAnnotations\src\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.DataAnnotations\ref\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj" /> <ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.DataAnnotations" ProjectPath="$(RepoRoot)src\Mvc\Mvc.DataAnnotations\src\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj" RefProjectPath="$(RepoRoot)src\Mvc\Mvc.DataAnnotations\ref\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj" />

View File

@ -73,7 +73,6 @@
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Razor" /> <AspNetCoreAppReference Include="Microsoft.AspNetCore.Razor" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Abstractions" /> <AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Abstractions" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" /> <AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Components.Prerendering" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Core" /> <AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Core" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Cors" /> <AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.Cors" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" /> <AspNetCoreAppReference Include="Microsoft.AspNetCore.Mvc.DataAnnotations" />

View File

@ -9,412 +9,412 @@
--> -->
<Dependencies> <Dependencies>
<ProductDependencies> <ProductDependencies>
<Dependency Name="Microsoft.AspNetCore.Blazor.Mono" Version="3.0.0-preview8.19380.1"> <Dependency Name="Microsoft.AspNetCore.Blazor.Mono" Version="3.0.0-preview9.19379.2">
<Uri>https://github.com/aspnet/Blazor</Uri> <Uri>https://github.com/aspnet/Blazor</Uri>
<Sha>2b834cef9e511554f9c580545a15d7107aea6cc0</Sha> <Sha>cd9254a05cfa52defeacd31697d25b2a4ed17510</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview8.19381.3"> <Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview9.19402.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>3cbb59559b5c0488bab471c0b8c0f2ecf14d5767</Sha> <Sha>f039aa935462163dead64ca2d6f9c6d27f4e290b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview8.19381.3"> <Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview9.19402.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>3cbb59559b5c0488bab471c0b8c0f2ecf14d5767</Sha> <Sha>f039aa935462163dead64ca2d6f9c6d27f4e290b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview8.19381.3"> <Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview9.19402.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>3cbb59559b5c0488bab471c0b8c0f2ecf14d5767</Sha> <Sha>f039aa935462163dead64ca2d6f9c6d27f4e290b</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview8.19381.3"> <Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview9.19402.1">
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri> <Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
<Sha>3cbb59559b5c0488bab471c0b8c0f2ecf14d5767</Sha> <Sha>f039aa935462163dead64ca2d6f9c6d27f4e290b</Sha>
</Dependency> </Dependency>
<Dependency Name="dotnet-ef" Version="3.0.0-preview8.19381.5"> <Dependency Name="dotnet-ef" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview8.19381.5"> <Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview8.19381.5"> <Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview8.19381.5"> <Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview8.19381.5"> <Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview8.19381.5"> <Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview8.19381.5"> <Dependency Name="Microsoft.EntityFrameworkCore" Version="3.0.0-preview9.19402.9">
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri> <Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
<Sha>d85ecc7c184862042033e38bee331b81fb6145d5</Sha> <Sha>49f9f7632c742108e5652f182922cc35c19c9162</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.AspNetCore.Analyzer.Testing" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.AspNetCore.BenchmarkRunner.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ActivatorUtilities.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.Memory" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.SqlServer" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.CommandLineUtils.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Json" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.KeyPerFile" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Configuration" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.DiagnosticAdapter" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Diagnostics.HealthChecks" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Embedded" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.HashCodeCombiner.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Hosting" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Http" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Localization.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Localization" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.AzureAppServices" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Console" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Debug" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging.Testing" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Logging" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ObjectPool" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Options" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ParameterDefaultValue.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.Primitives" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.TypeNameHelper.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.ValueStopwatch.Sources" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Extensions.WebEncoders" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.Internal.Extensions.Refs" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.JSInterop" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Mono.WebAssembly.Interop" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.Bcl.AsyncInterfaces" Version="1.0.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.CSharp" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.CSharp" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.Win32.Registry" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Win32.SystemEvents" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.Win32.SystemEvents" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.ComponentModel.Annotations" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64" Pinned="true"> <Dependency Name="System.Data.SqlClient" Version="4.7.0-preview6.19264.9" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64" Pinned="true">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha> <Sha>a28176b5ec68b6da1472934fe9493790d1665cae</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Diagnostics.EventLog" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Drawing.Common" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Drawing.Common" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.IO.Pipelines" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.IO.Pipelines" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Net.Http.WinHttpHandler" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Net.WebSockets.WebSocketProtocol" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Reflection.Metadata" Version="1.7.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Cryptography.Cng" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Cryptography.Pkcs" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Cryptography.Xml" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Permissions" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Permissions" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Security.Principal.Windows" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.ServiceProcess.ServiceController" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Text.Encodings.Web" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Text.Json" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Text.Json" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Threading.Channels" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Threading.Channels" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="System.Windows.Extensions" Version="4.6.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="System.Windows.Extensions" Version="4.6.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview8-28380-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.Extensions.DependencyModel" Version="3.0.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>c855ac718789051d5d67282c88decca445de7711</Sha> <Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.NETCore.App.Ref" Version="3.0.0-preview8-28380-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.NETCore.App.Ref" Version="3.0.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>c855ac718789051d5d67282c88decca445de7711</Sha> <Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
</Dependency> </Dependency>
<!-- <!--
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime. Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
All Runtime.$rid packages should have the same version. All Runtime.$rid packages should have the same version.
--> -->
<Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.0.0-preview8-28380-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="3.0.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>c855ac718789051d5d67282c88decca445de7711</Sha> <Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
</Dependency> </Dependency>
<Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview8-28380-08" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="NETStandard.Library.Ref" Version="2.1.0-preview8-28379-05" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/core-setup</Uri> <Uri>https://github.com/dotnet/core-setup</Uri>
<Sha>c855ac718789051d5d67282c88decca445de7711</Sha> <Sha>d15a0adeb874801e7bfaa4fbbb306a2efa268497</Sha>
</Dependency> </Dependency>
</ProductDependencies> </ProductDependencies>
<ToolsetDependencies> <ToolsetDependencies>
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 --> <!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview8.19379.7" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64"> <Dependency Name="Microsoft.NETCore.Platforms" Version="3.0.0-preview8.19378.8" CoherentParentDependency="Microsoft.NETCore.App.Runtime.win-x64">
<Uri>https://github.com/dotnet/corefx</Uri> <Uri>https://github.com/dotnet/corefx</Uri>
<Sha>7c56101d1829e8f317065f99d173834c38c2ec44</Sha> <Sha>80f411d58df8338ccd9430900b541a037a9cb383</Sha>
</Dependency> </Dependency>
<Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Internal.AspNetCore.Analyzers" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19369.2"> <Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19369.2">
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
@ -428,13 +428,13 @@
<Uri>https://github.com/dotnet/arcade</Uri> <Uri>https://github.com/dotnet/arcade</Uri>
<Sha>a190d4865fe3c86a168ec49c4fc61c90c96ae051</Sha> <Sha>a190d4865fe3c86a168ec49c4fc61c90c96ae051</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview8.19381.3" CoherentParentDependency="Microsoft.EntityFrameworkCore"> <Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview9.19401.2" CoherentParentDependency="Microsoft.EntityFrameworkCore">
<Uri>https://github.com/aspnet/Extensions</Uri> <Uri>https://github.com/aspnet/Extensions</Uri>
<Sha>dea3f207c8ea27f2a13ab15880df58ff91b42dfa</Sha> <Sha>54d000fda95c2c1f05b13a2e910fc91994da8eb8</Sha>
</Dependency> </Dependency>
<Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.3.0-beta2-19381-14" CoherentParentDependency="Microsoft.Extensions.Logging"> <Dependency Name="Microsoft.Net.Compilers.Toolset" Version="3.3.0-beta3-19401-01" CoherentParentDependency="Microsoft.Extensions.Logging">
<Uri>https://github.com/dotnet/roslyn</Uri> <Uri>https://github.com/dotnet/roslyn</Uri>
<Sha>ef3a7a3863ae53b610a4b0c3682a35cad0829583</Sha> <Sha>e9b4c66fb2f26bca02d4a718c48c1c39e9963c9f</Sha>
</Dependency> </Dependency>
</ToolsetDependencies> </ToolsetDependencies>
</Dependencies> </Dependencies>

View File

@ -9,7 +9,7 @@
<AspNetCoreMajorVersion>3</AspNetCoreMajorVersion> <AspNetCoreMajorVersion>3</AspNetCoreMajorVersion>
<AspNetCoreMinorVersion>0</AspNetCoreMinorVersion> <AspNetCoreMinorVersion>0</AspNetCoreMinorVersion>
<AspNetCorePatchVersion>0</AspNetCorePatchVersion> <AspNetCorePatchVersion>0</AspNetCorePatchVersion>
<PreReleasePreviewNumber>8</PreReleasePreviewNumber> <PreReleasePreviewNumber>9</PreReleasePreviewNumber>
<PreReleaseVersionLabel>preview$(PreReleasePreviewNumber)</PreReleaseVersionLabel> <PreReleaseVersionLabel>preview$(PreReleasePreviewNumber)</PreReleaseVersionLabel>
<PreReleaseBrandingLabel>Preview $(PreReleasePreviewNumber)</PreReleaseBrandingLabel> <PreReleaseBrandingLabel>Preview $(PreReleasePreviewNumber)</PreReleaseBrandingLabel>
<AspNetCoreMajorMinorVersion>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)</AspNetCoreMajorMinorVersion> <AspNetCoreMajorMinorVersion>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)</AspNetCoreMajorMinorVersion>
@ -52,115 +52,115 @@
<!-- Packages from dotnet/arcade --> <!-- Packages from dotnet/arcade -->
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19369.2</MicrosoftDotNetGenAPIPackageVersion> <MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19369.2</MicrosoftDotNetGenAPIPackageVersion>
<!-- Packages from dotnet/roslyn --> <!-- Packages from dotnet/roslyn -->
<MicrosoftNetCompilersToolsetPackageVersion>3.3.0-beta2-19381-14</MicrosoftNetCompilersToolsetPackageVersion> <MicrosoftNetCompilersToolsetPackageVersion>3.3.0-beta3-19401-01</MicrosoftNetCompilersToolsetPackageVersion>
<!-- Packages from dotnet/core-setup --> <!-- Packages from dotnet/core-setup -->
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview8-28380-08</MicrosoftExtensionsDependencyModelPackageVersion> <MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview8-28379-05</MicrosoftExtensionsDependencyModelPackageVersion>
<MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview8-28380-08</MicrosoftNETCoreAppRefPackageVersion> <MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview8-28379-05</MicrosoftNETCoreAppRefPackageVersion>
<MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.0.0-preview8-28380-08</MicrosoftNETCoreAppRuntimewinx64PackageVersion> <MicrosoftNETCoreAppRuntimewinx64PackageVersion>3.0.0-preview8-28379-05</MicrosoftNETCoreAppRuntimewinx64PackageVersion>
<NETStandardLibraryRefPackageVersion>2.1.0-preview8-28380-08</NETStandardLibraryRefPackageVersion> <NETStandardLibraryRefPackageVersion>2.1.0-preview8-28379-05</NETStandardLibraryRefPackageVersion>
<!-- Packages from dotnet/corefx --> <!-- Packages from dotnet/corefx -->
<MicrosoftBclAsyncInterfacesPackageVersion>1.0.0-preview8.19379.7</MicrosoftBclAsyncInterfacesPackageVersion> <MicrosoftBclAsyncInterfacesPackageVersion>1.0.0-preview8.19378.8</MicrosoftBclAsyncInterfacesPackageVersion>
<MicrosoftCSharpPackageVersion>4.6.0-preview8.19379.7</MicrosoftCSharpPackageVersion> <MicrosoftCSharpPackageVersion>4.6.0-preview8.19378.8</MicrosoftCSharpPackageVersion>
<MicrosoftWin32RegistryPackageVersion>4.6.0-preview8.19379.7</MicrosoftWin32RegistryPackageVersion> <MicrosoftWin32RegistryPackageVersion>4.6.0-preview8.19378.8</MicrosoftWin32RegistryPackageVersion>
<MicrosoftWin32SystemEventsPackageVersion>4.6.0-preview8.19379.7</MicrosoftWin32SystemEventsPackageVersion> <MicrosoftWin32SystemEventsPackageVersion>4.6.0-preview8.19378.8</MicrosoftWin32SystemEventsPackageVersion>
<SystemComponentModelAnnotationsPackageVersion>4.6.0-preview8.19379.7</SystemComponentModelAnnotationsPackageVersion> <SystemComponentModelAnnotationsPackageVersion>4.6.0-preview8.19378.8</SystemComponentModelAnnotationsPackageVersion>
<SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion> <SystemDataSqlClientPackageVersion>4.7.0-preview6.19264.9</SystemDataSqlClientPackageVersion>
<SystemDiagnosticsEventLogPackageVersion>4.6.0-preview8.19379.7</SystemDiagnosticsEventLogPackageVersion> <SystemDiagnosticsEventLogPackageVersion>4.6.0-preview8.19378.8</SystemDiagnosticsEventLogPackageVersion>
<SystemDrawingCommonPackageVersion>4.6.0-preview8.19379.7</SystemDrawingCommonPackageVersion> <SystemDrawingCommonPackageVersion>4.6.0-preview8.19378.8</SystemDrawingCommonPackageVersion>
<SystemIOPipelinesPackageVersion>4.6.0-preview8.19379.7</SystemIOPipelinesPackageVersion> <SystemIOPipelinesPackageVersion>4.6.0-preview8.19378.8</SystemIOPipelinesPackageVersion>
<SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview8.19379.7</SystemNetHttpWinHttpHandlerPackageVersion> <SystemNetHttpWinHttpHandlerPackageVersion>4.6.0-preview8.19378.8</SystemNetHttpWinHttpHandlerPackageVersion>
<SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview8.19379.7</SystemNetWebSocketsWebSocketProtocolPackageVersion> <SystemNetWebSocketsWebSocketProtocolPackageVersion>4.6.0-preview8.19378.8</SystemNetWebSocketsWebSocketProtocolPackageVersion>
<SystemReflectionMetadataPackageVersion>1.7.0-preview8.19379.7</SystemReflectionMetadataPackageVersion> <SystemReflectionMetadataPackageVersion>1.7.0-preview8.19378.8</SystemReflectionMetadataPackageVersion>
<SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview8.19379.7</SystemRuntimeCompilerServicesUnsafePackageVersion> <SystemRuntimeCompilerServicesUnsafePackageVersion>4.6.0-preview8.19378.8</SystemRuntimeCompilerServicesUnsafePackageVersion>
<SystemSecurityCryptographyCngPackageVersion>4.6.0-preview8.19379.7</SystemSecurityCryptographyCngPackageVersion> <SystemSecurityCryptographyCngPackageVersion>4.6.0-preview8.19378.8</SystemSecurityCryptographyCngPackageVersion>
<SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview8.19379.7</SystemSecurityCryptographyPkcsPackageVersion> <SystemSecurityCryptographyPkcsPackageVersion>4.6.0-preview8.19378.8</SystemSecurityCryptographyPkcsPackageVersion>
<SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview8.19379.7</SystemSecurityCryptographyXmlPackageVersion> <SystemSecurityCryptographyXmlPackageVersion>4.6.0-preview8.19378.8</SystemSecurityCryptographyXmlPackageVersion>
<SystemSecurityPermissionsPackageVersion>4.6.0-preview8.19379.7</SystemSecurityPermissionsPackageVersion> <SystemSecurityPermissionsPackageVersion>4.6.0-preview8.19378.8</SystemSecurityPermissionsPackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview8.19379.7</SystemSecurityPrincipalWindowsPackageVersion> <SystemSecurityPrincipalWindowsPackageVersion>4.6.0-preview8.19378.8</SystemSecurityPrincipalWindowsPackageVersion>
<SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview8.19379.7</SystemServiceProcessServiceControllerPackageVersion> <SystemServiceProcessServiceControllerPackageVersion>4.6.0-preview8.19378.8</SystemServiceProcessServiceControllerPackageVersion>
<SystemTextEncodingsWebPackageVersion>4.6.0-preview8.19379.7</SystemTextEncodingsWebPackageVersion> <SystemTextEncodingsWebPackageVersion>4.6.0-preview8.19378.8</SystemTextEncodingsWebPackageVersion>
<SystemTextJsonPackageVersion>4.6.0-preview8.19379.7</SystemTextJsonPackageVersion> <SystemTextJsonPackageVersion>4.6.0-preview8.19378.8</SystemTextJsonPackageVersion>
<SystemThreadingChannelsPackageVersion>4.6.0-preview8.19379.7</SystemThreadingChannelsPackageVersion> <SystemThreadingChannelsPackageVersion>4.6.0-preview8.19378.8</SystemThreadingChannelsPackageVersion>
<SystemWindowsExtensionsPackageVersion>4.6.0-preview8.19379.7</SystemWindowsExtensionsPackageVersion> <SystemWindowsExtensionsPackageVersion>4.6.0-preview8.19378.8</SystemWindowsExtensionsPackageVersion>
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 --> <!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview8.19379.7</MicrosoftNETCorePlatformsPackageVersion> <MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview8.19378.8</MicrosoftNETCorePlatformsPackageVersion>
<!-- Packages from aspnet/Blazor --> <!-- Packages from aspnet/Blazor -->
<MicrosoftAspNetCoreBlazorMonoPackageVersion>3.0.0-preview8.19380.1</MicrosoftAspNetCoreBlazorMonoPackageVersion> <MicrosoftAspNetCoreBlazorMonoPackageVersion>3.0.0-preview9.19379.2</MicrosoftAspNetCoreBlazorMonoPackageVersion>
<!-- Packages from aspnet/Extensions --> <!-- Packages from aspnet/Extensions -->
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview8.19381.3</InternalAspNetCoreAnalyzersPackageVersion> <InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview9.19401.2</InternalAspNetCoreAnalyzersPackageVersion>
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview8.19381.3</MicrosoftAspNetCoreAnalyzerTestingPackageVersion> <MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview9.19401.2</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
<MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion> <MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftAspNetCoreBenchmarkRunnerSourcesPackageVersion>
<MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview8.19381.3</MicrosoftAspNetCoreTestingPackageVersion> <MicrosoftAspNetCoreTestingPackageVersion>3.0.0-preview9.19401.2</MicrosoftAspNetCoreTestingPackageVersion>
<MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion> <MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsActivatorUtilitiesSourcesPackageVersion>
<MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsCachingAbstractionsPackageVersion> <MicrosoftExtensionsCachingAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsCachingAbstractionsPackageVersion>
<MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsCachingMemoryPackageVersion> <MicrosoftExtensionsCachingMemoryPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsCachingMemoryPackageVersion>
<MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsCachingSqlServerPackageVersion> <MicrosoftExtensionsCachingSqlServerPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsCachingSqlServerPackageVersion>
<MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion> <MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsCachingStackExchangeRedisPackageVersion>
<MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion> <MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsCommandLineUtilsSourcesPackageVersion>
<MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationAbstractionsPackageVersion> <MicrosoftExtensionsConfigurationAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationAbstractionsPackageVersion>
<MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion> <MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationAzureKeyVaultPackageVersion>
<MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationBinderPackageVersion> <MicrosoftExtensionsConfigurationBinderPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationBinderPackageVersion>
<MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationCommandLinePackageVersion> <MicrosoftExtensionsConfigurationCommandLinePackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationCommandLinePackageVersion>
<MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion> <MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion>
<MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion> <MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationFileExtensionsPackageVersion>
<MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationIniPackageVersion> <MicrosoftExtensionsConfigurationIniPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationIniPackageVersion>
<MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationJsonPackageVersion> <MicrosoftExtensionsConfigurationJsonPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationJsonPackageVersion>
<MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion> <MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationKeyPerFilePackageVersion>
<MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationPackageVersion> <MicrosoftExtensionsConfigurationPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationPackageVersion>
<MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationUserSecretsPackageVersion> <MicrosoftExtensionsConfigurationUserSecretsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationUserSecretsPackageVersion>
<MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsConfigurationXmlPackageVersion> <MicrosoftExtensionsConfigurationXmlPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsConfigurationXmlPackageVersion>
<MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion> <MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsDependencyInjectionAbstractionsPackageVersion>
<MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsDependencyInjectionPackageVersion> <MicrosoftExtensionsDependencyInjectionPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsDependencyInjectionPackageVersion>
<MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsDiagnosticAdapterPackageVersion> <MicrosoftExtensionsDiagnosticAdapterPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsDiagnosticAdapterPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion> <MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsDiagnosticsHealthChecksAbstractionsPackageVersion>
<MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion> <MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsDiagnosticsHealthChecksPackageVersion>
<MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion> <MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsFileProvidersAbstractionsPackageVersion>
<MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsFileProvidersCompositePackageVersion> <MicrosoftExtensionsFileProvidersCompositePackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsFileProvidersCompositePackageVersion>
<MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion> <MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsFileProvidersEmbeddedPackageVersion>
<MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsFileProvidersPhysicalPackageVersion> <MicrosoftExtensionsFileProvidersPhysicalPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsFileProvidersPhysicalPackageVersion>
<MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsFileSystemGlobbingPackageVersion> <MicrosoftExtensionsFileSystemGlobbingPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsFileSystemGlobbingPackageVersion>
<MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion> <MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsHashCodeCombinerSourcesPackageVersion>
<MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsHostingAbstractionsPackageVersion> <MicrosoftExtensionsHostingAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsHostingAbstractionsPackageVersion>
<MicrosoftExtensionsHostingPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsHostingPackageVersion> <MicrosoftExtensionsHostingPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsHostingPackageVersion>
<MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion> <MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsHostFactoryResolverSourcesPackageVersion>
<MicrosoftExtensionsHttpPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsHttpPackageVersion> <MicrosoftExtensionsHttpPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsHttpPackageVersion>
<MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLocalizationAbstractionsPackageVersion> <MicrosoftExtensionsLocalizationAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLocalizationAbstractionsPackageVersion>
<MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLocalizationPackageVersion> <MicrosoftExtensionsLocalizationPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLocalizationPackageVersion>
<MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingAbstractionsPackageVersion> <MicrosoftExtensionsLoggingAbstractionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingAbstractionsPackageVersion>
<MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion> <MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingAzureAppServicesPackageVersion>
<MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingConfigurationPackageVersion> <MicrosoftExtensionsLoggingConfigurationPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingConfigurationPackageVersion>
<MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingConsolePackageVersion> <MicrosoftExtensionsLoggingConsolePackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingConsolePackageVersion>
<MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingDebugPackageVersion> <MicrosoftExtensionsLoggingDebugPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingDebugPackageVersion>
<MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingEventSourcePackageVersion> <MicrosoftExtensionsLoggingEventSourcePackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingEventSourcePackageVersion>
<MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingEventLogPackageVersion> <MicrosoftExtensionsLoggingEventLogPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingEventLogPackageVersion>
<MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingPackageVersion> <MicrosoftExtensionsLoggingPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingPackageVersion>
<MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingTestingPackageVersion> <MicrosoftExtensionsLoggingTestingPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingTestingPackageVersion>
<MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsLoggingTraceSourcePackageVersion> <MicrosoftExtensionsLoggingTraceSourcePackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsLoggingTraceSourcePackageVersion>
<MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsObjectPoolPackageVersion> <MicrosoftExtensionsObjectPoolPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsObjectPoolPackageVersion>
<MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion> <MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsOptionsConfigurationExtensionsPackageVersion>
<MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion> <MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsOptionsDataAnnotationsPackageVersion>
<MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsOptionsPackageVersion> <MicrosoftExtensionsOptionsPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsOptionsPackageVersion>
<MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion> <MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsParameterDefaultValueSourcesPackageVersion>
<MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsPrimitivesPackageVersion> <MicrosoftExtensionsPrimitivesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsPrimitivesPackageVersion>
<MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion> <MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsTypeNameHelperSourcesPackageVersion>
<MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsValueStopwatchSourcesPackageVersion> <MicrosoftExtensionsValueStopwatchSourcesPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsValueStopwatchSourcesPackageVersion>
<MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview8.19381.3</MicrosoftExtensionsWebEncodersPackageVersion> <MicrosoftExtensionsWebEncodersPackageVersion>3.0.0-preview9.19401.2</MicrosoftExtensionsWebEncodersPackageVersion>
<MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview8.19381.3</MicrosoftInternalExtensionsRefsPackageVersion> <MicrosoftInternalExtensionsRefsPackageVersion>3.0.0-preview9.19401.2</MicrosoftInternalExtensionsRefsPackageVersion>
<MicrosoftJSInteropPackageVersion>3.0.0-preview8.19381.3</MicrosoftJSInteropPackageVersion> <MicrosoftJSInteropPackageVersion>3.0.0-preview9.19401.2</MicrosoftJSInteropPackageVersion>
<MonoWebAssemblyInteropPackageVersion>3.0.0-preview8.19381.3</MonoWebAssemblyInteropPackageVersion> <MonoWebAssemblyInteropPackageVersion>3.0.0-preview9.19401.2</MonoWebAssemblyInteropPackageVersion>
<!-- Packages from aspnet/EntityFrameworkCore --> <!-- Packages from aspnet/EntityFrameworkCore -->
<dotnetefPackageVersion>3.0.0-preview8.19381.5</dotnetefPackageVersion> <dotnetefPackageVersion>3.0.0-preview9.19402.9</dotnetefPackageVersion>
<MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview8.19381.5</MicrosoftEntityFrameworkCoreInMemoryPackageVersion> <MicrosoftEntityFrameworkCoreInMemoryPackageVersion>3.0.0-preview9.19402.9</MicrosoftEntityFrameworkCoreInMemoryPackageVersion>
<MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview8.19381.5</MicrosoftEntityFrameworkCoreRelationalPackageVersion> <MicrosoftEntityFrameworkCoreRelationalPackageVersion>3.0.0-preview9.19402.9</MicrosoftEntityFrameworkCoreRelationalPackageVersion>
<MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview8.19381.5</MicrosoftEntityFrameworkCoreSqlitePackageVersion> <MicrosoftEntityFrameworkCoreSqlitePackageVersion>3.0.0-preview9.19402.9</MicrosoftEntityFrameworkCoreSqlitePackageVersion>
<MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview8.19381.5</MicrosoftEntityFrameworkCoreSqlServerPackageVersion> <MicrosoftEntityFrameworkCoreSqlServerPackageVersion>3.0.0-preview9.19402.9</MicrosoftEntityFrameworkCoreSqlServerPackageVersion>
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview8.19381.5</MicrosoftEntityFrameworkCoreToolsPackageVersion> <MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview9.19402.9</MicrosoftEntityFrameworkCoreToolsPackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview8.19381.5</MicrosoftEntityFrameworkCorePackageVersion> <MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview9.19402.9</MicrosoftEntityFrameworkCorePackageVersion>
<!-- Packages from aspnet/AspNetCore-Tooling --> <!-- Packages from aspnet/AspNetCore-Tooling -->
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview8.19381.3</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion> <MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview9.19402.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview8.19381.3</MicrosoftAspNetCoreRazorLanguagePackageVersion> <MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview9.19402.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview8.19381.3</MicrosoftCodeAnalysisRazorPackageVersion> <MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview9.19402.1</MicrosoftCodeAnalysisRazorPackageVersion>
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview8.19381.3</MicrosoftNETSdkRazorPackageVersion> <MicrosoftNETSdkRazorPackageVersion>3.0.0-preview9.19402.1</MicrosoftNETSdkRazorPackageVersion>
</PropertyGroup> </PropertyGroup>
<!-- <!--

View File

@ -43,4 +43,9 @@
This one sets UseSharedCompilation to false by default. --> This one sets UseSharedCompilation to false by default. -->
<UseSharedCompilation>true</UseSharedCompilation> <UseSharedCompilation>true</UseSharedCompilation>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<!-- Ignore warning about calling the Pack target on Web SDK projects. Our build scripts call /t:pack on everything in this repo. -->
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
</PropertyGroup>
</Project> </Project>

View File

@ -15,11 +15,6 @@
<BundledNETCorePlatformsPackageVersion>$(MicrosoftNETCorePlatformsPackageVersion)</BundledNETCorePlatformsPackageVersion> <BundledNETCorePlatformsPackageVersion>$(MicrosoftNETCorePlatformsPackageVersion)</BundledNETCorePlatformsPackageVersion>
</PropertyGroup> </PropertyGroup>
<!-- Workaround https://github.com/dotnet/sdk/issues/2976 -->
<ItemGroup>
<PackageReference Update="Microsoft.NETCore.Platforms" PrivateAssets="All" />
</ItemGroup>
<!-- Workaround https://github.com/aspnet/AspNetCore/issues/7503. This chains GenerateSourceLinkFile before razor component targets run. --> <!-- Workaround https://github.com/aspnet/AspNetCore/issues/7503. This chains GenerateSourceLinkFile before razor component targets run. -->
<!-- Workaround https://github.com/dotnet/source-build/issues/1112. Source link is currently disabled in source build so do not apply this worksaround. --> <!-- Workaround https://github.com/dotnet/source-build/issues/1112. Source link is currently disabled in source build so do not apply this worksaround. -->
<Target Condition="'$(DotNetBuildFromSource)' != 'true'" <Target Condition="'$(DotNetBuildFromSource)' != 'true'"
@ -30,12 +25,6 @@
<!-- Workaround https://github.com/dotnet/source-build/issues/1112. Source link is currently disabled in source build so define this dummy target which is required for pack. --> <!-- Workaround https://github.com/dotnet/source-build/issues/1112. Source link is currently disabled in source build so define this dummy target which is required for pack. -->
<Import Condition="'$(DotNetBuildFromSource)' == 'true'" Project="WorkaroundsImported.targets" /> <Import Condition="'$(DotNetBuildFromSource)' == 'true'" Project="WorkaroundsImported.targets" />
<!-- Workaround https://github.com/aspnet/websdk/pull/646. If merged, once we update to a websdk with this fix, we can move the setting below to Directory.Build.props. -->
<PropertyGroup>
<!-- Ignore warning about calling the Pack target on Web SDK projects. Our build scripts call /t:pack on everything in this repo. -->
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
</PropertyGroup>
<!-- Workaround for https://github.com/dotnet/arcade/issues/204 --> <!-- Workaround for https://github.com/dotnet/arcade/issues/204 -->
<ItemGroup> <ItemGroup>
<PackageReference Include="Internal.AspNetCore.BuildTasks" PrivateAssets="All" Version="$(InternalAspNetCoreBuildTasksPackageVersion)" IsImplicitlyDefined="true" /> <PackageReference Include="Internal.AspNetCore.BuildTasks" PrivateAssets="All" Version="$(InternalAspNetCoreBuildTasksPackageVersion)" IsImplicitlyDefined="true" />
@ -54,21 +43,6 @@
</KnownFrameworkReference> </KnownFrameworkReference>
</ItemGroup> </ItemGroup>
<!-- Workaround until we can build our repo with a 3.0 Preview 7 SDK which has https://github.com/dotnet/core-sdk/pull/2401. -->
<ItemGroup Condition="'$(PreReleasePreviewNumber)' == '7' ">
<KnownFrameworkReference Update="Microsoft.NETCore.App">
<!--
Temporary until we can update to build with the Preview7 SDK .
Using PreReleasePreviewNumber to time-bomb this so we can remove this before RTM.
This workaround was also applied to src\ProjectTemplates\test\Infrastructure\TemplateTests.props.in.
-->
<RuntimePackNamePatterns>Microsoft.NETCore.App.Runtime.**RID**</RuntimePackNamePatterns>
<AppHostPackNamePattern />
<AppHostRuntimeIdentifiers />
</KnownFrameworkReference>
</ItemGroup>
<!-- Work around https://github.com/dotnet/cli/issues/11378. --> <!-- Work around https://github.com/dotnet/cli/issues/11378. -->
<Target Name="_WorkaroundNetStandard" AfterTargets="ResolvePackageAssets"> <Target Name="_WorkaroundNetStandard" AfterTargets="ResolvePackageAssets">
<ItemGroup> <ItemGroup>

View File

@ -13,8 +13,12 @@ namespace Microsoft.AspNetCore.Analyzers.TestFiles.CompilationFeatureDetectorTes
app.UseEndpoints(endpoints => app.UseEndpoints(endpoints =>
{ {
endpoints.MapBlazorHub(); endpoints.MapBlazorHub<App>("app");
}); });
} }
public class App : Microsoft.AspNetCore.Components.ComponentBase
{
}
} }
} }

View File

@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
new LocalizableResourceString(nameof(Resources.ComponentParameterSettersShouldBePublic_Title), Resources.ResourceManager, typeof(Resources)), new LocalizableResourceString(nameof(Resources.ComponentParameterSettersShouldBePublic_Title), Resources.ResourceManager, typeof(Resources)),
new LocalizableResourceString(nameof(Resources.ComponentParameterSettersShouldBePublic_Format), Resources.ResourceManager, typeof(Resources)), new LocalizableResourceString(nameof(Resources.ComponentParameterSettersShouldBePublic_Format), Resources.ResourceManager, typeof(Resources)),
"Encapsulation", "Encapsulation",
DiagnosticSeverity.Warning, DiagnosticSeverity.Error,
isEnabledByDefault: true, isEnabledByDefault: true,
description: new LocalizableResourceString(nameof(Resources.ComponentParameterSettersShouldBePublic_Description), Resources.ResourceManager, typeof(Resources))); description: new LocalizableResourceString(nameof(Resources.ComponentParameterSettersShouldBePublic_Description), Resources.ResourceManager, typeof(Resources)));
@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
new LocalizableResourceString(nameof(Resources.ComponentParameterShouldBePublic_Title), Resources.ResourceManager, typeof(Resources)), new LocalizableResourceString(nameof(Resources.ComponentParameterShouldBePublic_Title), Resources.ResourceManager, typeof(Resources)),
new LocalizableResourceString(nameof(Resources.ComponentParameterShouldBePublic_Format), Resources.ResourceManager, typeof(Resources)), new LocalizableResourceString(nameof(Resources.ComponentParameterShouldBePublic_Format), Resources.ResourceManager, typeof(Resources)),
"Encapsulation", "Encapsulation",
DiagnosticSeverity.Warning, DiagnosticSeverity.Error,
isEnabledByDefault: true, isEnabledByDefault: true,
description: new LocalizableResourceString(nameof(Resources.ComponentParametersShouldBePublic_Description), Resources.ResourceManager, typeof(Resources))); description: new LocalizableResourceString(nameof(Resources.ComponentParametersShouldBePublic_Description), Resources.ResourceManager, typeof(Resources)));

View File

@ -78,7 +78,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty1' should have a public setter.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty1' should have a public setter.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 7, 39) new DiagnosticResultLocation("Test0.cs", 7, 39)
@ -88,7 +88,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty2' should have a public setter.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty2' should have a public setter.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 8, 39) new DiagnosticResultLocation("Test0.cs", 8, 39)
@ -98,7 +98,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty3' should have a public setter.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty3' should have a public setter.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 9, 39) new DiagnosticResultLocation("Test0.cs", 9, 39)

View File

@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers.Test
{ {
Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.BadProperty1' should be public.", Message = "Component parameter 'ConsoleApplication1.TypeName.BadProperty1' should be public.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 8, 40) new DiagnosticResultLocation("Test0.cs", 8, 40)
@ -85,7 +85,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers.Test
{ {
Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty1' should have a public setter.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty1' should have a public setter.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 8, 39) new DiagnosticResultLocation("Test0.cs", 8, 39)
@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers.Test
{ {
Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty2' should have a public setter.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty2' should have a public setter.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 9, 39) new DiagnosticResultLocation("Test0.cs", 9, 39)
@ -105,7 +105,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers.Test
{ {
Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParameterSettersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty3' should have a public setter.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty3' should have a public setter.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 10, 39) new DiagnosticResultLocation("Test0.cs", 10, 39)

View File

@ -63,7 +63,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty1' should be public.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty1' should be public.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 7, 32) new DiagnosticResultLocation("Test0.cs", 7, 32)
@ -73,7 +73,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty2' should be public.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty2' should be public.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 8, 40) new DiagnosticResultLocation("Test0.cs", 8, 40)
@ -83,7 +83,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty3' should be public.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty3' should be public.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 9, 42) new DiagnosticResultLocation("Test0.cs", 9, 42)
@ -93,7 +93,7 @@ namespace Microsoft.AspNetCore.Components.Analyzers
{ {
Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id, Id = DiagnosticDescriptors.ComponentParametersShouldBePublic.Id,
Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty4' should be public.", Message = "Component parameter 'ConsoleApplication1.TypeName.MyProperty4' should be public.",
Severity = DiagnosticSeverity.Warning, Severity = DiagnosticSeverity.Error,
Locations = new[] Locations = new[]
{ {
new DiagnosticResultLocation("Test0.cs", 10, 41) new DiagnosticResultLocation("Test0.cs", 10, 41)

View File

@ -1,6 +1,15 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNetCore.Blazor
{
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
public static partial class JSInteropMethods
{
[Microsoft.JSInterop.JSInvokableAttribute("NotifyLocationChanged")]
public static void NotifyLocationChanged(string uri, bool isInterceptedLink) { }
}
}
namespace Microsoft.AspNetCore.Blazor.Hosting namespace Microsoft.AspNetCore.Blazor.Hosting
{ {
public static partial class BlazorWebAssemblyHost public static partial class BlazorWebAssemblyHost
@ -62,24 +71,12 @@ namespace Microsoft.AspNetCore.Blazor.Rendering
public override Microsoft.AspNetCore.Components.Dispatcher Dispatcher { get { throw null; } } public override Microsoft.AspNetCore.Components.Dispatcher Dispatcher { get { throw null; } }
public System.Threading.Tasks.Task AddComponentAsync(System.Type componentType, string domElementSelector) { throw null; } public System.Threading.Tasks.Task AddComponentAsync(System.Type componentType, string domElementSelector) { throw null; }
public System.Threading.Tasks.Task AddComponentAsync<TComponent>(string domElementSelector) where TComponent : Microsoft.AspNetCore.Components.IComponent { throw null; } public System.Threading.Tasks.Task AddComponentAsync<TComponent>(string domElementSelector) where TComponent : Microsoft.AspNetCore.Components.IComponent { throw null; }
public override System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo eventFieldInfo, Microsoft.AspNetCore.Components.UIEventArgs eventArgs) { throw null; } public override System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo eventFieldInfo, System.EventArgs eventArgs) { throw null; }
protected override void Dispose(bool disposing) { } protected override void Dispose(bool disposing) { }
protected override void HandleException(System.Exception exception) { } protected override void HandleException(System.Exception exception) { }
protected override System.Threading.Tasks.Task UpdateDisplayAsync(in Microsoft.AspNetCore.Components.Rendering.RenderBatch batch) { throw null; } protected override System.Threading.Tasks.Task UpdateDisplayAsync(in Microsoft.AspNetCore.Components.Rendering.RenderBatch batch) { throw null; }
} }
} }
namespace Microsoft.AspNetCore.Blazor.Services
{
public partial class WebAssemblyUriHelper : Microsoft.AspNetCore.Components.UriHelperBase
{
internal WebAssemblyUriHelper() { }
public static readonly Microsoft.AspNetCore.Blazor.Services.WebAssemblyUriHelper Instance;
protected override void EnsureInitialized() { }
protected override void NavigateToCore(string uri, bool forceLoad) { }
[Microsoft.JSInterop.JSInvokableAttribute("NotifyLocationChanged")]
public static void NotifyLocationChanged(string newAbsoluteUri, bool isInterceptedLink) { }
}
}
namespace Microsoft.AspNetCore.Components.Builder namespace Microsoft.AspNetCore.Components.Builder
{ {
public static partial class ComponentsApplicationBuilderExtensions public static partial class ComponentsApplicationBuilderExtensions

View File

@ -92,16 +92,16 @@ namespace Microsoft.AspNetCore.Blazor.Hosting
services.AddSingleton<IWebAssemblyHost, WebAssemblyHost>(); services.AddSingleton<IWebAssemblyHost, WebAssemblyHost>();
services.AddSingleton<IJSRuntime>(WebAssemblyJSRuntime.Instance); services.AddSingleton<IJSRuntime>(WebAssemblyJSRuntime.Instance);
services.AddSingleton<IComponentContext, WebAssemblyComponentContext>(); services.AddSingleton<IComponentContext, WebAssemblyComponentContext>();
services.AddSingleton<IUriHelper>(WebAssemblyUriHelper.Instance); services.AddSingleton<NavigationManager>(WebAssemblyNavigationManager.Instance);
services.AddSingleton<INavigationInterception>(WebAssemblyNavigationInterception.Instance); services.AddSingleton<INavigationInterception>(WebAssemblyNavigationInterception.Instance);
services.AddSingleton<ILoggerFactory, WebAssemblyLoggerFactory>(); services.AddSingleton<ILoggerFactory, WebAssemblyLoggerFactory>();
services.AddSingleton<HttpClient>(s => services.AddSingleton<HttpClient>(s =>
{ {
// Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it. // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it.
var uriHelper = s.GetRequiredService<IUriHelper>(); var navigationManager = s.GetRequiredService<NavigationManager>();
return new HttpClient return new HttpClient
{ {
BaseAddress = new Uri(WebAssemblyUriHelper.Instance.GetBaseUri()) BaseAddress = new Uri(navigationManager.BaseUri)
}; };
}); });

View File

@ -0,0 +1,26 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.ComponentModel;
using Microsoft.AspNetCore.Blazor.Services;
using Microsoft.JSInterop;
namespace Microsoft.AspNetCore.Blazor
{
/// <summary>
/// Contains methods called by interop. Intended for framework use only, not supported for use in application
/// code.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public static class JSInteropMethods
{
/// <summary>
/// For framework use only.
/// </summary>
[JSInvokable(nameof(NotifyLocationChanged))]
public static void NotifyLocationChanged(string uri, bool isInterceptedLink)
{
WebAssemblyNavigationManager.Instance.SetLocation(uri, isInterceptedLink);
}
}
}

View File

@ -120,7 +120,7 @@ namespace Microsoft.AspNetCore.Blazor.Rendering
} }
/// <inheritdoc /> /// <inheritdoc />
public override Task DispatchEventAsync(ulong eventHandlerId, EventFieldInfo eventFieldInfo, UIEventArgs eventArgs) public override Task DispatchEventAsync(ulong eventHandlerId, EventFieldInfo eventFieldInfo, EventArgs eventArgs)
{ {
// Be sure we only run one event handler at once. Although they couldn't run // Be sure we only run one event handler at once. Although they couldn't run
// simultaneously anyway (there's only one thread), they could run nested on // simultaneously anyway (there's only one thread), they could run nested on
@ -185,10 +185,10 @@ namespace Microsoft.AspNetCore.Blazor.Rendering
{ {
public readonly ulong EventHandlerId; public readonly ulong EventHandlerId;
public readonly EventFieldInfo EventFieldInfo; public readonly EventFieldInfo EventFieldInfo;
public readonly UIEventArgs EventArgs; public readonly EventArgs EventArgs;
public readonly TaskCompletionSource<object> TaskCompletionSource; public readonly TaskCompletionSource<object> TaskCompletionSource;
public IncomingEventInfo(ulong eventHandlerId, EventFieldInfo eventFieldInfo, UIEventArgs eventArgs) public IncomingEventInfo(ulong eventHandlerId, EventFieldInfo eventFieldInfo, EventArgs eventArgs)
{ {
EventHandlerId = eventHandlerId; EventHandlerId = eventHandlerId;
EventFieldInfo = eventFieldInfo; EventFieldInfo = eventFieldInfo;

View File

@ -3,7 +3,7 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Components.Routing;
using Interop = Microsoft.AspNetCore.Components.Web.BrowserUriHelperInterop; using Interop = Microsoft.AspNetCore.Components.Web.BrowserNavigationManagerInterop;
namespace Microsoft.AspNetCore.Blazor.Services namespace Microsoft.AspNetCore.Blazor.Services
{ {

View File

@ -0,0 +1,53 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Components;
using Interop = Microsoft.AspNetCore.Components.Web.BrowserNavigationManagerInterop;
namespace Microsoft.AspNetCore.Blazor.Services
{
/// <summary>
/// Default client-side implementation of <see cref="NavigationManager"/>.
/// </summary>
internal class WebAssemblyNavigationManager : NavigationManager
{
/// <summary>
/// Gets the instance of <see cref="WebAssemblyNavigationManager"/>.
/// </summary>
public static readonly WebAssemblyNavigationManager Instance = new WebAssemblyNavigationManager();
// For simplicity we force public consumption of the BrowserNavigationManager through
// a singleton. Only a single instance can be updated by the browser through
// interop. We can construct instances for testing.
internal WebAssemblyNavigationManager()
{
}
protected override void EnsureInitialized()
{
// As described in the comment block above, BrowserNavigationManager is only for
// client-side (Mono) use, so it's OK to rely on synchronicity here.
var baseUri = WebAssemblyJSRuntime.Instance.Invoke<string>(Interop.GetBaseUri);
var uri = WebAssemblyJSRuntime.Instance.Invoke<string>(Interop.GetLocationHref);
Initialize(baseUri, uri);
}
public void SetLocation(string uri, bool isInterceptedLink)
{
Uri = uri;
NotifyLocationChanged(isInterceptedLink);
}
/// <inheritdoc />
protected override void NavigateToCore(string uri, bool forceLoad)
{
if (uri == null)
{
throw new ArgumentNullException(nameof(uri));
}
WebAssemblyJSRuntime.Instance.Invoke<object>(Interop.NavigateTo, uri, forceLoad);
}
}
}

View File

@ -1,85 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using Interop = Microsoft.AspNetCore.Components.Web.BrowserUriHelperInterop;
namespace Microsoft.AspNetCore.Blazor.Services
{
/// <summary>
/// Default client-side implementation of <see cref="IUriHelper"/>.
/// </summary>
public class WebAssemblyUriHelper : UriHelperBase
{
/// <summary>
/// Gets the instance of <see cref="WebAssemblyUriHelper"/>.
/// </summary>
public static readonly WebAssemblyUriHelper Instance = new WebAssemblyUriHelper();
// For simplicity we force public consumption of the BrowserUriHelper through
// a singleton. Only a single instance can be updated by the browser through
// interop. We can construct instances for testing.
internal WebAssemblyUriHelper()
{
}
protected override void EnsureInitialized()
{
WebAssemblyJSRuntime.Instance.Invoke<object>(
Interop.ListenForNavigationEvents,
typeof(WebAssemblyUriHelper).Assembly.GetName().Name,
nameof(NotifyLocationChanged));
// As described in the comment block above, BrowserUriHelper is only for
// client-side (Mono) use, so it's OK to rely on synchronicity here.
var baseUri = WebAssemblyJSRuntime.Instance.Invoke<string>(Interop.GetBaseUri);
var uri = WebAssemblyJSRuntime.Instance.Invoke<string>(Interop.GetLocationHref);
InitializeState(uri, baseUri);
}
/// <inheritdoc />
protected override void NavigateToCore(string uri, bool forceLoad)
{
if (uri == null)
{
throw new ArgumentNullException(nameof(uri));
}
WebAssemblyJSRuntime.Instance.Invoke<object>(Interop.NavigateTo, uri, forceLoad);
}
/// <summary>
/// For framework use only.
/// </summary>
[JSInvokable(nameof(NotifyLocationChanged))]
public static void NotifyLocationChanged(string newAbsoluteUri, bool isInterceptedLink)
{
Instance.SetAbsoluteUri(newAbsoluteUri);
Instance.TriggerOnLocationChanged(isInterceptedLink);
}
/// <summary>
/// Given the document's document.baseURI value, returns the URI
/// that can be prepended to relative URI paths to produce an absolute URI.
/// This is computed by removing anything after the final slash.
/// Internal for tests.
/// </summary>
/// <param name="absoluteBaseUri">The page's document.baseURI value.</param>
/// <returns>The URI prefix</returns>
internal static string ToBaseUri(string absoluteBaseUri)
{
if (absoluteBaseUri != null)
{
var lastSlashIndex = absoluteBaseUri.LastIndexOf('/');
if (lastSlashIndex >= 0)
{
return absoluteBaseUri.Substring(0, lastSlashIndex + 1);
}
}
return "/";
}
}
}

View File

@ -1,57 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Xunit;
namespace Microsoft.AspNetCore.Blazor.Services.Test
{
public class WebAssemblyUriHelperTest
{
private WebAssemblyUriHelper _uriHelper = new WebAssemblyUriHelper();
[Theory]
[InlineData("scheme://host/", "scheme://host/")]
[InlineData("scheme://host:123/", "scheme://host:123/")]
[InlineData("scheme://host/path", "scheme://host/")]
[InlineData("scheme://host/path/", "scheme://host/path/")]
[InlineData("scheme://host/path/page?query=string&another=here", "scheme://host/path/")]
public void ComputesCorrectBaseUri(string baseUri, string expectedResult)
{
var actualResult = WebAssemblyUriHelper.ToBaseUri(baseUri);
Assert.Equal(expectedResult, actualResult);
}
[Theory]
[InlineData("scheme://host/", "scheme://host", "")]
[InlineData("scheme://host/", "scheme://host/", "")]
[InlineData("scheme://host/", "scheme://host/path", "path")]
[InlineData("scheme://host/path/", "scheme://host/path/", "")]
[InlineData("scheme://host/path/", "scheme://host/path/more", "more")]
[InlineData("scheme://host/path/", "scheme://host/path", "")]
[InlineData("scheme://host/path/", "scheme://host/path#hash", "#hash")]
[InlineData("scheme://host/path/", "scheme://host/path/#hash", "#hash")]
[InlineData("scheme://host/path/", "scheme://host/path/more#hash", "more#hash")]
public void ComputesCorrectValidBaseRelativePaths(string baseUri, string absoluteUri, string expectedResult)
{
var actualResult = _uriHelper.ToBaseRelativePath(baseUri, absoluteUri);
Assert.Equal(expectedResult, actualResult);
}
[Theory]
[InlineData("scheme://host/", "otherscheme://host/")]
[InlineData("scheme://host/", "scheme://otherhost/")]
[InlineData("scheme://host/path/", "scheme://host/")]
public void ThrowsForInvalidBaseRelativePaths(string baseUri, string absoluteUri)
{
var ex = Assert.Throws<ArgumentException>(() =>
{
_uriHelper.ToBaseRelativePath(baseUri, absoluteUri);
});
Assert.Equal(
$"The URI '{absoluteUri}' is not contained by the base URI '{baseUri}'.",
ex.Message);
}
}
}

View File

@ -46,12 +46,11 @@
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties> <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<UndefineProperties>TargetFramework</UndefineProperties> <UndefineProperties>TargetFramework</UndefineProperties>
</ProjectReference> </ProjectReference>
<ProjectReference Include="$(MSBuildThisFileDirectory)..\..\DevServer\src\Microsoft.AspNetCore.Blazor.DevServer.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<!-- Optimization. Do not require framework compatibility between these projects. -->
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
<UndefineProperties>TargetFramework</UndefineProperties>
</ProjectReference>
</ItemGroup> </ItemGroup>
<PropertyGroup>
<!-- When referencing from source, we need to disable VS's fast up-to-date check,
because otherwise changing the underlying Blazor library code isn't enough
to make it rebuild the affected library apps. -->
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
</Project> </Project>

View File

@ -253,7 +253,7 @@ namespace Test
public class MyComponent : ComponentBase public class MyComponent : ComponentBase
{ {
[Parameter] [Parameter]
public Action<UIEventArgs> OnClick { get; set; } public Action<EventArgs> OnClick { get; set; }
} }
} }
")); "));
@ -263,7 +263,7 @@ namespace Test
@code { @code {
private int counter; private int counter;
private void Increment(UIEventArgs e) { private void Increment(EventArgs e) {
counter++; counter++;
} }
}"); }");
@ -280,7 +280,7 @@ namespace Test
AssertFrame.Attribute(frame, "OnClick", 1); AssertFrame.Attribute(frame, "OnClick", 1);
// The handler will have been assigned to a lambda // The handler will have been assigned to a lambda
var handler = Assert.IsType<Action<UIEventArgs>>(frame.AttributeValue); var handler = Assert.IsType<Action<EventArgs>>(frame.AttributeValue);
Assert.Equal("Test.TestComponent", handler.Target.GetType().FullName); Assert.Equal("Test.TestComponent", handler.Target.GetType().FullName);
Assert.Equal("Increment", handler.Method.Name); Assert.Equal("Increment", handler.Method.Name);
}); });

View File

@ -332,7 +332,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
// Trigger the change event to show it updates the property // Trigger the change event to show it updates the property
// //
// This should always complete synchronously. // This should always complete synchronously.
var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new UIChangeEventArgs { Value = "Modified value", })); var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new ChangeEventArgs { Value = "Modified value", }));
Assert.Equal(TaskStatus.RanToCompletion, task.Status); Assert.Equal(TaskStatus.RanToCompletion, task.Status);
await task; await task;
@ -367,7 +367,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
// Trigger the change event to show it updates the property // Trigger the change event to show it updates the property
// //
// This should always complete synchronously. // This should always complete synchronously.
var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new UIChangeEventArgs { Value = "Modified value", })); var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new ChangeEventArgs { Value = "Modified value", }));
Assert.Equal(TaskStatus.RanToCompletion, task.Status); Assert.Equal(TaskStatus.RanToCompletion, task.Status);
await task; await task;
@ -404,7 +404,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
// //
// This should always complete synchronously. // This should always complete synchronously.
var newDateValue = new DateTime(2018, 3, 5, 4, 5, 6); var newDateValue = new DateTime(2018, 3, 5, 4, 5, 6);
var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new UIChangeEventArgs { Value = newDateValue.ToString(), })); var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new ChangeEventArgs { Value = newDateValue.ToString(), }));
Assert.Equal(TaskStatus.RanToCompletion, task.Status); Assert.Equal(TaskStatus.RanToCompletion, task.Status);
await task; await task;
@ -440,7 +440,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
// Trigger the change event to show it updates the property // Trigger the change event to show it updates the property
// //
// This should always complete synchronously. // This should always complete synchronously.
var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new UIChangeEventArgs { Value = new DateTime(2018, 3, 5).ToString(testDateFormat), })); var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new ChangeEventArgs { Value = new DateTime(2018, 3, 5).ToString(testDateFormat), }));
Assert.Equal(TaskStatus.RanToCompletion, task.Status); Assert.Equal(TaskStatus.RanToCompletion, task.Status);
await task; await task;
@ -559,7 +559,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
// Trigger the change event to show it updates the property // Trigger the change event to show it updates the property
// //
// This should always complete synchronously. // This should always complete synchronously.
var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new UIChangeEventArgs() { Value = false, })); var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new ChangeEventArgs() { Value = false, }));
Assert.Equal(TaskStatus.RanToCompletion, task.Status); Assert.Equal(TaskStatus.RanToCompletion, task.Status);
await task; await task;
@ -595,7 +595,7 @@ namespace Microsoft.AspNetCore.Blazor.Build.Test
// Trigger the change event to show it updates the property // Trigger the change event to show it updates the property
// //
// This should always complete synchronously. // This should always complete synchronously.
var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new UIChangeEventArgs { Value = MyEnum.SecondValue.ToString(), })); var task = renderer.Dispatcher.InvokeAsync(() => setter.InvokeAsync(new ChangeEventArgs { Value = MyEnum.SecondValue.ToString(), }));
Assert.Equal(TaskStatus.RanToCompletion, task.Status); Assert.Equal(TaskStatus.RanToCompletion, task.Status);
await task; await task;

View File

@ -1,5 +1,4 @@
<Project> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<NuspecFile>Microsoft.AspNetCore.Blazor.Templates.nuspec</NuspecFile> <NuspecFile>Microsoft.AspNetCore.Blazor.Templates.nuspec</NuspecFile>
@ -16,18 +15,31 @@
<IsProjectReferenceProvider>false</IsProjectReferenceProvider> <IsProjectReferenceProvider>false</IsProjectReferenceProvider>
</PropertyGroup> </PropertyGroup>
<Target Name="TransformTemplateConfigs" BeforeTargets="CoreBuild" DependsOnTargets="SetTemplateJsonSymbolReplacements"> <ItemGroup>
<!-- <UpToDateCheckInput Include="content\**\.template.config.src\**\*.*" />
For each template, copy its '.template.config.src' directory to '.template.config', </ItemGroup>
removing any earlier output at that location
--> <Target Name="PrepareFileLists" AfterTargets="PrepareForBuild">
<ItemGroup> <ItemGroup>
<_TemplateConfigMainFile Include="content\**\.template.config.src\template.json" /> <_TemplateConfigMainFile Include="content\**\.template.config.src\template.json" />
<_TemplateConfigDir Include="@(_TemplateConfigMainFile-&gt;'$([System.IO.Path]::GetDirectoryName('%(_TemplateConfigMainFile.FullPath)'))')" /> <_TemplateConfigDir Include="@(_TemplateConfigMainFile->'$([System.IO.Path]::GetDirectoryName('%(_TemplateConfigMainFile.FullPath)'))')" />
<_TemplateConfigFileToCopy Include="%(_TemplateConfigDir.Identity)\**\*.*"> <_TemplateConfigFileToCopy Include="%(_TemplateConfigDir.Identity)\**\*.*">
<DestDir>$([System.IO.Path]::GetDirectoryName('%(_TemplateConfigDir.Identity)'))\.template.config\</DestDir> <DestDir>$([System.IO.Path]::GetDirectoryName('%(_TemplateConfigDir.Identity)'))\.template.config\</DestDir>
</_TemplateConfigFileToCopy> </_TemplateConfigFileToCopy>
</ItemGroup> </ItemGroup>
</Target>
<Target
Name="TransformTemplateConfigs"
BeforeTargets="CoreBuild"
DependsOnTargets="SetTemplateJsonSymbolReplacements"
Inputs="@(_TemplateConfigFileToCopy)"
Outputs="@(_TemplateConfigFileToCopy->'%(DestDir)%(FileName)%(Extension)')">
<!--
For each template, copy its '.template.config.src' directory to '.template.config',
removing any earlier output at that location
-->
<RemoveDir Directories="%(_TemplateConfigFileToCopy.DestDir)" /> <RemoveDir Directories="%(_TemplateConfigFileToCopy.DestDir)" />
<Copy SourceFiles="%(_TemplateConfigFileToCopy.Identity)" DestinationFolder="%(_TemplateConfigFileToCopy.DestDir)" /> <Copy SourceFiles="%(_TemplateConfigFileToCopy.Identity)" DestinationFolder="%(_TemplateConfigFileToCopy.DestDir)" />
@ -49,8 +61,4 @@
<Output TaskParameter="OutputPath" ItemName="Content" /> <Output TaskParameter="OutputPath" ItemName="Content" />
</GenerateFileFromTemplate> </GenerateFileFromTemplate>
</Target> </Target>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<!-- Override SDK targets. This project does not produce a .dll. -->
<Target Name="CoreCompile" />
<Target Name="GetTargetPath" />
</Project> </Project>

View File

@ -1,5 +1,5 @@
<Router AppAssembly="typeof(Program).Assembly"> <Router AppAssembly="typeof(Program).Assembly">
<NotFoundContent> <NotFound>
<p>Sorry, there's nothing at this address.</p> <p>Sorry, there's nothing at this address.</p>
</NotFoundContent> </NotFound>
</Router> </Router>

View File

@ -208,8 +208,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
..\..\.editorconfig = ..\..\.editorconfig ..\..\.editorconfig = ..\..\.editorconfig
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Components.Prerendering", "..\Mvc\Mvc.Components.Prerendering\src\Microsoft.AspNetCore.Mvc.Components.Prerendering.csproj", "{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Protocols.Json", "..\SignalR\common\Protocols.Json\src\Microsoft.AspNetCore.SignalR.Protocols.Json.csproj", "{ED210157-461B-45BB-9D86-B81A62792C30}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Protocols.Json", "..\SignalR\common\Protocols.Json\src\Microsoft.AspNetCore.SignalR.Protocols.Json.csproj", "{ED210157-461B-45BB-9D86-B81A62792C30}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client", "..\SignalR\clients\csharp\Client\src\Microsoft.AspNetCore.SignalR.Client.csproj", "{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Client", "..\SignalR\clients\csharp\Client\src\Microsoft.AspNetCore.SignalR.Client.csproj", "{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0}"
@ -1330,18 +1328,6 @@ Global
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.Build.0 = Debug|Any CPU {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x64.Build.0 = Debug|Any CPU
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.ActiveCfg = Debug|Any CPU {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.ActiveCfg = Debug|Any CPU
{9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.Build.0 = Debug|Any CPU {9088E4E4-B855-457F-AE9E-D86709A5E1F4}.Release|x86.Build.0 = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Debug|x64.ActiveCfg = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Debug|x64.Build.0 = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Debug|x86.ActiveCfg = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Debug|x86.Build.0 = Debug|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Release|Any CPU.Build.0 = Release|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Release|x64.ActiveCfg = Release|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Release|x64.Build.0 = Release|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Release|x86.ActiveCfg = Release|Any CPU
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C}.Release|x86.Build.0 = Release|Any CPU
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.Build.0 = Debug|Any CPU {ED210157-461B-45BB-9D86-B81A62792C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ED210157-461B-45BB-9D86-B81A62792C30}.Debug|x64.ActiveCfg = Debug|Any CPU {ED210157-461B-45BB-9D86-B81A62792C30}.Debug|x64.ActiveCfg = Debug|Any CPU
@ -1548,7 +1534,6 @@ Global
{04262990-929C-42BF-85A9-21C25FA95617} = {2FC10057-7A0A-4E34-8302-879925BC0102} {04262990-929C-42BF-85A9-21C25FA95617} = {2FC10057-7A0A-4E34-8302-879925BC0102}
{DC47C40A-FC38-44E4-94A4-ADE794E76309} = {2FC10057-7A0A-4E34-8302-879925BC0102} {DC47C40A-FC38-44E4-94A4-ADE794E76309} = {2FC10057-7A0A-4E34-8302-879925BC0102}
{9088E4E4-B855-457F-AE9E-D86709A5E1F4} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} {9088E4E4-B855-457F-AE9E-D86709A5E1F4} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF}
{3A4132B6-60DA-43A0-8E7B-4BF346F3247C} = {2FC10057-7A0A-4E34-8302-879925BC0102}
{ED210157-461B-45BB-9D86-B81A62792C30} = {2FC10057-7A0A-4E34-8302-879925BC0102} {ED210157-461B-45BB-9D86-B81A62792C30} = {2FC10057-7A0A-4E34-8302-879925BC0102}
{DA137BD4-F7F1-4D53-855F-5EC40CEA36B0} = {2FC10057-7A0A-4E34-8302-879925BC0102} {DA137BD4-F7F1-4D53-855F-5EC40CEA36B0} = {2FC10057-7A0A-4E34-8302-879925BC0102}
{0CDAB70B-71DC-43BE-ACB7-AD2EE3541FFB} = {2FC10057-7A0A-4E34-8302-879925BC0102} {0CDAB70B-71DC-43BE-ACB7-AD2EE3541FFB} = {2FC10057-7A0A-4E34-8302-879925BC0102}

View File

@ -119,6 +119,11 @@ namespace Microsoft.AspNetCore.Components
public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { } public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; } public System.Threading.Tasks.Task SetParametersAsync(Microsoft.AspNetCore.Components.ParameterView parameters) { throw null; }
} }
public partial class ChangeEventArgs : System.EventArgs
{
public ChangeEventArgs() { }
public object Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
}
public abstract partial class ComponentBase : Microsoft.AspNetCore.Components.IComponent, Microsoft.AspNetCore.Components.IHandleAfterRender, Microsoft.AspNetCore.Components.IHandleEvent public abstract partial class ComponentBase : Microsoft.AspNetCore.Components.IComponent, Microsoft.AspNetCore.Components.IHandleAfterRender, Microsoft.AspNetCore.Components.IHandleEvent
{ {
public ComponentBase() { } public ComponentBase() { }
@ -188,35 +193,35 @@ namespace Microsoft.AspNetCore.Components
} }
public static partial class EventCallbackFactoryBinderExtensions public static partial class EventCallbackFactoryBinderExtensions
{ {
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool> setter, bool existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool> setter, bool existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime> setter, System.DateTime existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal> setter, decimal existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal> setter, decimal existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double> setter, double existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double> setter, double existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int> setter, int existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int> setter, int existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long> setter, long existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long> setter, long existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool?> setter, bool? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<bool?> setter, bool? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.DateTime?> setter, System.DateTime? existingValue, string format, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal?> setter, decimal? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<decimal?> setter, decimal? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double?> setter, double? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<double?> setter, double? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int?> setter, int? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<int?> setter, int? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long?> setter, long? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<long?> setter, long? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float?> setter, float? existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float?> setter, float? existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float> setter, float existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<float> setter, float existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<string> setter, string existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<string> setter, string existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> CreateBinder<T>(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<T> setter, T existingValue, System.Globalization.CultureInfo culture = null) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> CreateBinder<T>(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<T> setter, T existingValue, System.Globalization.CultureInfo culture = null) { throw null; }
} }
public static partial class EventCallbackFactoryUIEventArgsExtensions public static partial class EventCallbackFactoryEventArgsExtensions
{ {
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<Microsoft.AspNetCore.Components.UIChangeEventArgs> callback) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<Microsoft.AspNetCore.Components.ChangeEventArgs> callback) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<Microsoft.AspNetCore.Components.UIEventArgs> callback) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<System.EventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Action<System.EventArgs> callback) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIChangeEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Func<Microsoft.AspNetCore.Components.UIChangeEventArgs, System.Threading.Tasks.Task> callback) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Func<Microsoft.AspNetCore.Components.ChangeEventArgs, System.Threading.Tasks.Task> callback) { throw null; }
public static Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.UIEventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Func<Microsoft.AspNetCore.Components.UIEventArgs, System.Threading.Tasks.Task> callback) { throw null; } public static Microsoft.AspNetCore.Components.EventCallback<System.EventArgs> Create(this Microsoft.AspNetCore.Components.EventCallbackFactory factory, object receiver, System.Func<System.EventArgs, System.Threading.Tasks.Task> callback) { throw null; }
} }
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct EventCallbackWorkItem public readonly partial struct EventCallbackWorkItem
@ -261,16 +266,6 @@ namespace Microsoft.AspNetCore.Components
{ {
public InjectAttribute() { } public InjectAttribute() { }
} }
public partial interface IUriHelper
{
event System.EventHandler<Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs> OnLocationChanged;
string GetAbsoluteUri();
string GetBaseUri();
void NavigateTo(string uri);
void NavigateTo(string uri, bool forceLoad);
System.Uri ToAbsoluteUri(string href);
string ToBaseRelativePath(string baseUri, string locationAbsolute);
}
[System.AttributeUsageAttribute(System.AttributeTargets.Class, AllowMultiple=false, Inherited=true)] [System.AttributeUsageAttribute(System.AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public sealed partial class LayoutAttribute : System.Attribute public sealed partial class LayoutAttribute : System.Attribute
{ {
@ -283,6 +278,10 @@ namespace Microsoft.AspNetCore.Components
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment Body { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.RenderFragment Body { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public sealed partial class LocationChangeException : System.Exception
{
public LocationChangeException(string message, System.Exception innerException) { }
}
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct MarkupString public readonly partial struct MarkupString
{ {
@ -297,13 +296,40 @@ namespace Microsoft.AspNetCore.Components
public NavigationException(string uri) { } public NavigationException(string uri) { }
public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
} }
public abstract partial class NavigationManager
{
protected NavigationManager() { }
public string BaseUri { get { throw null; } protected set { } }
public string Uri { get { throw null; } protected set { } }
public event System.EventHandler<Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs> LocationChanged { add { } remove { } }
protected virtual void EnsureInitialized() { }
protected void Initialize(string baseUri, string uri) { }
public void NavigateTo(string uri, bool forceLoad = false) { }
protected abstract void NavigateToCore(string uri, bool forceLoad);
protected void NotifyLocationChanged(bool isInterceptedLink) { }
public System.Uri ToAbsoluteUri(string relativeUri) { throw null; }
public string ToBaseRelativePath(string uri) { throw null; }
}
public abstract partial class OwningComponentBase : Microsoft.AspNetCore.Components.ComponentBase, System.IDisposable
{
protected OwningComponentBase() { }
protected bool IsDisposed { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
protected System.IServiceProvider ScopedServices { get { throw null; } }
protected virtual void Dispose(bool disposing) { }
void System.IDisposable.Dispose() { }
}
public abstract partial class OwningComponentBase<TService> : Microsoft.AspNetCore.Components.OwningComponentBase, System.IDisposable
{
protected OwningComponentBase() { }
protected TService Service { get { throw null; } }
}
public partial class PageDisplay : Microsoft.AspNetCore.Components.IComponent public partial class PageDisplay : Microsoft.AspNetCore.Components.IComponent
{ {
public PageDisplay() { } public PageDisplay() { }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment AuthorizingContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorizedContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Type Page { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.Type Page { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
@ -365,33 +391,6 @@ namespace Microsoft.AspNetCore.Components
public RouteAttribute(string template) { } public RouteAttribute(string template) { }
public string Template { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public string Template { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
} }
public partial class UIChangeEventArgs : Microsoft.AspNetCore.Components.UIEventArgs
{
public UIChangeEventArgs() { }
public object Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
}
public partial class UIEventArgs
{
public UIEventArgs() { }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
}
public abstract partial class UriHelperBase : Microsoft.AspNetCore.Components.IUriHelper
{
protected UriHelperBase() { }
public event System.EventHandler<Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs> OnLocationChanged { add { } remove { } }
protected virtual void EnsureInitialized() { }
public string GetAbsoluteUri() { throw null; }
public virtual string GetBaseUri() { throw null; }
public virtual void InitializeState(string uriAbsolute, string baseUriAbsolute) { }
public void NavigateTo(string uri) { }
public void NavigateTo(string uri, bool forceLoad) { }
protected abstract void NavigateToCore(string uri, bool forceLoad);
protected void SetAbsoluteBaseUri(string baseUri) { }
protected void SetAbsoluteUri(string uri) { }
public System.Uri ToAbsoluteUri(string href) { throw null; }
public string ToBaseRelativePath(string baseUri, string locationAbsolute) { throw null; }
protected void TriggerOnLocationChanged(bool isinterceptedLink) { }
}
} }
namespace Microsoft.AspNetCore.Components.CompilerServices namespace Microsoft.AspNetCore.Components.CompilerServices
{ {
@ -419,8 +418,10 @@ namespace Microsoft.AspNetCore.Components.Forms
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier Field(string fieldName) { throw null; } public Microsoft.AspNetCore.Components.Forms.FieldIdentifier Field(string fieldName) { throw null; }
public System.Collections.Generic.IEnumerable<string> GetValidationMessages() { throw null; } public System.Collections.Generic.IEnumerable<string> GetValidationMessages() { throw null; }
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; } public System.Collections.Generic.IEnumerable<string> GetValidationMessages(Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
public System.Collections.Generic.IEnumerable<string> GetValidationMessages(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
public bool IsModified() { throw null; } public bool IsModified() { throw null; }
public bool IsModified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; } public bool IsModified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
public bool IsModified(System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
public void MarkAsUnmodified() { } public void MarkAsUnmodified() { }
public void MarkAsUnmodified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { } public void MarkAsUnmodified(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
public void NotifyFieldChanged(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { } public void NotifyFieldChanged(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
@ -431,24 +432,20 @@ namespace Microsoft.AspNetCore.Components.Forms
{ {
public static Microsoft.AspNetCore.Components.Forms.EditContext AddDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext editContext) { throw null; } public static Microsoft.AspNetCore.Components.Forms.EditContext AddDataAnnotationsValidation(this Microsoft.AspNetCore.Components.Forms.EditContext editContext) { throw null; }
} }
public static partial class EditContextExpressionExtensions public sealed partial class FieldChangedEventArgs : System.EventArgs
{ {
public static System.Collections.Generic.IEnumerable<string> GetValidationMessages(this Microsoft.AspNetCore.Components.Forms.EditContext editContext, System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; } public FieldChangedEventArgs(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
public static bool IsModified(this Microsoft.AspNetCore.Components.Forms.EditContext editContext, System.Linq.Expressions.Expression<System.Func<object>> accessor) { throw null; }
}
public sealed partial class FieldChangedEventArgs
{
internal FieldChangedEventArgs() { }
public Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
} }
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public readonly partial struct FieldIdentifier public readonly partial struct FieldIdentifier : System.IEquatable<Microsoft.AspNetCore.Components.Forms.FieldIdentifier>
{ {
private readonly object _dummy; private readonly object _dummy;
public FieldIdentifier(object model, string fieldName) { throw null; } public FieldIdentifier(object model, string fieldName) { throw null; }
public string FieldName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public string FieldName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public object Model { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public static Microsoft.AspNetCore.Components.Forms.FieldIdentifier Create<T>(System.Linq.Expressions.Expression<System.Func<T>> accessor) { throw null; } public static Microsoft.AspNetCore.Components.Forms.FieldIdentifier Create<T>(System.Linq.Expressions.Expression<System.Func<T>> accessor) { throw null; }
public bool Equals(Microsoft.AspNetCore.Components.Forms.FieldIdentifier otherIdentifier) { throw null; }
public override bool Equals(object obj) { throw null; } public override bool Equals(object obj) { throw null; }
public override int GetHashCode() { throw null; } public override int GetHashCode() { throw null; }
} }
@ -457,24 +454,23 @@ namespace Microsoft.AspNetCore.Components.Forms
public ValidationMessageStore(Microsoft.AspNetCore.Components.Forms.EditContext editContext) { } public ValidationMessageStore(Microsoft.AspNetCore.Components.Forms.EditContext editContext) { }
public System.Collections.Generic.IEnumerable<string> this[Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier] { get { throw null; } } public System.Collections.Generic.IEnumerable<string> this[Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier] { get { throw null; } }
public System.Collections.Generic.IEnumerable<string> this[System.Linq.Expressions.Expression<System.Func<object>> accessor] { get { throw null; } } public System.Collections.Generic.IEnumerable<string> this[System.Linq.Expressions.Expression<System.Func<object>> accessor] { get { throw null; } }
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, System.Collections.Generic.IEnumerable<string> messages) { }
public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, string message) { } public void Add(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, string message) { }
public void AddRange(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier, System.Collections.Generic.IEnumerable<string> messages) { } public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, System.Collections.Generic.IEnumerable<string> messages) { }
public void Add(System.Linq.Expressions.Expression<System.Func<object>> accessor, string message) { }
public void Clear() { } public void Clear() { }
public void Clear(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { } public void Clear(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { }
public void Clear(System.Linq.Expressions.Expression<System.Func<object>> accessor) { }
} }
public static partial class ValidationMessageStoreExpressionExtensions public sealed partial class ValidationRequestedEventArgs : System.EventArgs
{ {
public static void Add(this Microsoft.AspNetCore.Components.Forms.ValidationMessageStore store, System.Linq.Expressions.Expression<System.Func<object>> accessor, string message) { } public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationRequestedEventArgs Empty;
public static void AddRange(this Microsoft.AspNetCore.Components.Forms.ValidationMessageStore store, System.Linq.Expressions.Expression<System.Func<object>> accessor, System.Collections.Generic.IEnumerable<string> messages) { } public ValidationRequestedEventArgs() { }
public static void Clear(this Microsoft.AspNetCore.Components.Forms.ValidationMessageStore store, System.Linq.Expressions.Expression<System.Func<object>> accessor) { }
} }
public sealed partial class ValidationRequestedEventArgs public sealed partial class ValidationStateChangedEventArgs : System.EventArgs
{ {
internal ValidationRequestedEventArgs() { } public static readonly new Microsoft.AspNetCore.Components.Forms.ValidationStateChangedEventArgs Empty;
} public ValidationStateChangedEventArgs() { }
public sealed partial class ValidationStateChangedEventArgs
{
internal ValidationStateChangedEventArgs() { }
} }
} }
namespace Microsoft.AspNetCore.Components.Rendering namespace Microsoft.AspNetCore.Components.Rendering
@ -519,7 +515,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
public event System.UnhandledExceptionEventHandler UnhandledSynchronizationException { add { } remove { } } public event System.UnhandledExceptionEventHandler UnhandledSynchronizationException { add { } remove { } }
protected internal virtual void AddToRenderQueue(int componentId, Microsoft.AspNetCore.Components.RenderFragment renderFragment) { } protected internal virtual void AddToRenderQueue(int componentId, Microsoft.AspNetCore.Components.RenderFragment renderFragment) { }
protected internal int AssignRootComponentId(Microsoft.AspNetCore.Components.IComponent component) { throw null; } protected internal int AssignRootComponentId(Microsoft.AspNetCore.Components.IComponent component) { throw null; }
public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, Microsoft.AspNetCore.Components.UIEventArgs eventArgs) { throw null; } public virtual System.Threading.Tasks.Task DispatchEventAsync(ulong eventHandlerId, Microsoft.AspNetCore.Components.Rendering.EventFieldInfo fieldInfo, System.EventArgs eventArgs) { throw null; }
public void Dispose() { } public void Dispose() { }
protected virtual void Dispose(bool disposing) { } protected virtual void Dispose(bool disposing) { }
protected abstract void HandleException(System.Exception exception); protected abstract void HandleException(System.Exception exception);
@ -632,16 +628,17 @@ namespace Microsoft.AspNetCore.Components.RenderTree
} }
namespace Microsoft.AspNetCore.Components.Routing namespace Microsoft.AspNetCore.Components.Routing
{ {
public partial interface IHostEnvironmentNavigationManager
{
void Initialize(string baseUri, string uri);
}
public partial interface INavigationInterception public partial interface INavigationInterception
{ {
System.Threading.Tasks.Task EnableNavigationInterceptionAsync(); System.Threading.Tasks.Task EnableNavigationInterceptionAsync();
} }
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public partial class LocationChangedEventArgs : System.EventArgs
public readonly partial struct LocationChangedEventArgs
{ {
private readonly object _dummy; public LocationChangedEventArgs(string location, bool isNavigationIntercepted) { }
private readonly int _dummyPrimitive;
public LocationChangedEventArgs(string location, bool isNavigationIntercepted) { throw null; }
public bool IsNavigationIntercepted { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public bool IsNavigationIntercepted { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public string Location { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
} }
@ -651,11 +648,11 @@ namespace Microsoft.AspNetCore.Components.Routing
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Reflection.Assembly AppAssembly { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.Reflection.Assembly AppAssembly { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment AuthorizingContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.RenderFragment Authorizing { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorizedContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.RenderFragment<Microsoft.AspNetCore.Components.AuthenticationState> NotAuthorized { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public Microsoft.AspNetCore.Components.RenderFragment NotFoundContent { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.RenderFragment NotFound { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { } public void Attach(Microsoft.AspNetCore.Components.RenderHandle renderHandle) { }
public void Dispose() { } public void Dispose() { }
System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync() { throw null; } System.Threading.Tasks.Task Microsoft.AspNetCore.Components.IHandleAfterRender.OnAfterRenderAsync() { throw null; }

View File

@ -58,8 +58,8 @@ namespace Microsoft.AspNetCore.Components
} }
else if (isAuthorized) else if (isAuthorized)
{ {
var authorizedContent = Authorized ?? ChildContent; var authorized = Authorized ?? ChildContent;
builder.AddContent(1, authorizedContent?.Invoke(currentAuthenticationState)); builder.AddContent(1, authorized?.Invoke(currentAuthenticationState));
} }
else else
{ {

View File

@ -1,16 +1,19 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace Microsoft.AspNetCore.Components namespace Microsoft.AspNetCore.Components
{ {
/// <summary> /// <summary>
/// Supplies information about an event that is being raised. /// Supplies information about an change event that is being raised.
/// </summary> /// </summary>
public class UIEventArgs public class ChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
/// Gets or sets the type of the event. /// Gets or sets the new value.
/// </summary> /// </summary>
public string Type { get; set; } public object Value { get; set; }
} }
} }

View File

@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<string> setter, Action<string> setter,
@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<bool> setter, Action<bool> setter,
@ -69,7 +69,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<bool?> setter, Action<bool?> setter,
@ -88,7 +88,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<int> setter, Action<int> setter,
@ -107,7 +107,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<int?> setter, Action<int?> setter,
@ -126,7 +126,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<long> setter, Action<long> setter,
@ -145,7 +145,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<long?> setter, Action<long?> setter,
@ -164,7 +164,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<float> setter, Action<float> setter,
@ -183,7 +183,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<float?> setter, Action<float?> setter,
@ -202,7 +202,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<double> setter, Action<double> setter,
@ -221,7 +221,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<double?> setter, Action<double?> setter,
@ -240,7 +240,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<decimal> setter, Action<decimal> setter,
@ -259,7 +259,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<decimal?> setter, Action<decimal?> setter,
@ -278,7 +278,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTime> setter, Action<DateTime> setter,
@ -298,7 +298,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="format"></param> /// <param name="format"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTime> setter, Action<DateTime> setter,
@ -318,7 +318,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTime?> setter, Action<DateTime?> setter,
@ -338,7 +338,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="format"></param> /// <param name="format"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTime?> setter, Action<DateTime?> setter,
@ -358,7 +358,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTimeOffset> setter, Action<DateTimeOffset> setter,
@ -378,7 +378,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="format"></param> /// <param name="format"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTimeOffset> setter, Action<DateTimeOffset> setter,
@ -398,7 +398,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTimeOffset?> setter, Action<DateTimeOffset?> setter,
@ -418,7 +418,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="format"></param> /// <param name="format"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder( public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<DateTimeOffset?> setter, Action<DateTimeOffset?> setter,
@ -439,7 +439,7 @@ namespace Microsoft.AspNetCore.Components
/// <param name="existingValue"></param> /// <param name="existingValue"></param>
/// <param name="culture"></param> /// <param name="culture"></param>
/// <returns></returns> /// <returns></returns>
public static EventCallback<UIChangeEventArgs> CreateBinder<T>( public static EventCallback<ChangeEventArgs> CreateBinder<T>(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<T> setter, Action<T> setter,
@ -449,14 +449,14 @@ namespace Microsoft.AspNetCore.Components
return CreateBinderCore<T>(factory, receiver, setter, culture, ParserDelegateCache.Get<T>()); return CreateBinderCore<T>(factory, receiver, setter, culture, ParserDelegateCache.Get<T>());
} }
private static EventCallback<UIChangeEventArgs> CreateBinderCore<T>( private static EventCallback<ChangeEventArgs> CreateBinderCore<T>(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<T> setter, Action<T> setter,
CultureInfo culture, CultureInfo culture,
BindConverter.BindParser<T> converter) BindConverter.BindParser<T> converter)
{ {
Action<UIChangeEventArgs> callback = e => Action<ChangeEventArgs> callback = e =>
{ {
T value = default; T value = default;
var converted = false; var converted = false;
@ -489,10 +489,10 @@ namespace Microsoft.AspNetCore.Components
setter(default); setter(default);
} }
}; };
return factory.Create<UIChangeEventArgs>(receiver, callback); return factory.Create<ChangeEventArgs>(receiver, callback);
} }
private static EventCallback<UIChangeEventArgs> CreateBinderCore<T>( private static EventCallback<ChangeEventArgs> CreateBinderCore<T>(
this EventCallbackFactory factory, this EventCallbackFactory factory,
object receiver, object receiver,
Action<T> setter, Action<T> setter,
@ -500,7 +500,7 @@ namespace Microsoft.AspNetCore.Components
string format, string format,
BindConverter.BindParserWithFormat<T> converter) BindConverter.BindParserWithFormat<T> converter)
{ {
Action<UIChangeEventArgs> callback = e => Action<ChangeEventArgs> callback = e =>
{ {
T value = default; T value = default;
var converted = false; var converted = false;
@ -533,7 +533,7 @@ namespace Microsoft.AspNetCore.Components
setter(default); setter(default);
} }
}; };
return factory.Create<UIChangeEventArgs>(receiver, callback); return factory.Create<ChangeEventArgs>(receiver, callback);
} }
} }
} }

View File

@ -7,9 +7,9 @@ using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Components namespace Microsoft.AspNetCore.Components
{ {
/// <summary> /// <summary>
/// Provides extension methods for <see cref="EventCallbackFactory"/> and <see cref="UIEventArgs"/> types. /// Provides extension methods for <see cref="EventCallbackFactory"/> and <see cref="EventArgs"/> types.
/// </summary> /// </summary>
public static class EventCallbackFactoryUIEventArgsExtensions public static class EventCallbackFactoryEventArgsExtensions
{ {
/// <summary> /// <summary>
/// Creates an <see cref="EventCallback"/> for the provided <paramref name="receiver"/> and /// Creates an <see cref="EventCallback"/> for the provided <paramref name="receiver"/> and
@ -19,14 +19,14 @@ namespace Microsoft.AspNetCore.Components
/// <param name="receiver">The event receiver.</param> /// <param name="receiver">The event receiver.</param>
/// <param name="callback">The event callback.</param> /// <param name="callback">The event callback.</param>
/// <returns>The <see cref="EventCallback"/>.</returns> /// <returns>The <see cref="EventCallback"/>.</returns>
public static EventCallback<UIEventArgs> Create(this EventCallbackFactory factory, object receiver, Action<UIEventArgs> callback) public static EventCallback<EventArgs> Create(this EventCallbackFactory factory, object receiver, Action<EventArgs> callback)
{ {
if (factory == null) if (factory == null)
{ {
throw new ArgumentNullException(nameof(factory)); throw new ArgumentNullException(nameof(factory));
} }
return factory.Create<UIEventArgs>(receiver, callback); return factory.Create<EventArgs>(receiver, callback);
} }
/// <summary> /// <summary>
@ -37,14 +37,14 @@ namespace Microsoft.AspNetCore.Components
/// <param name="receiver">The event receiver.</param> /// <param name="receiver">The event receiver.</param>
/// <param name="callback">The event callback.</param> /// <param name="callback">The event callback.</param>
/// <returns>The <see cref="EventCallback"/>.</returns> /// <returns>The <see cref="EventCallback"/>.</returns>
public static EventCallback<UIEventArgs> Create(this EventCallbackFactory factory, object receiver, Func<UIEventArgs, Task> callback) public static EventCallback<EventArgs> Create(this EventCallbackFactory factory, object receiver, Func<EventArgs, Task> callback)
{ {
if (factory == null) if (factory == null)
{ {
throw new ArgumentNullException(nameof(factory)); throw new ArgumentNullException(nameof(factory));
} }
return factory.Create<UIEventArgs>(receiver, callback); return factory.Create<EventArgs>(receiver, callback);
} }
/// <summary> /// <summary>
@ -55,14 +55,14 @@ namespace Microsoft.AspNetCore.Components
/// <param name="receiver">The event receiver.</param> /// <param name="receiver">The event receiver.</param>
/// <param name="callback">The event callback.</param> /// <param name="callback">The event callback.</param>
/// <returns>The <see cref="EventCallback"/>.</returns> /// <returns>The <see cref="EventCallback"/>.</returns>
public static EventCallback<UIChangeEventArgs> Create(this EventCallbackFactory factory, object receiver, Action<UIChangeEventArgs> callback) public static EventCallback<ChangeEventArgs> Create(this EventCallbackFactory factory, object receiver, Action<ChangeEventArgs> callback)
{ {
if (factory == null) if (factory == null)
{ {
throw new ArgumentNullException(nameof(factory)); throw new ArgumentNullException(nameof(factory));
} }
return factory.Create<UIChangeEventArgs>(receiver, callback); return factory.Create<ChangeEventArgs>(receiver, callback);
} }
/// <summary> /// <summary>
@ -73,14 +73,14 @@ namespace Microsoft.AspNetCore.Components
/// <param name="receiver">The event receiver.</param> /// <param name="receiver">The event receiver.</param>
/// <param name="callback">The event callback.</param> /// <param name="callback">The event callback.</param>
/// <returns>The <see cref="EventCallback"/>.</returns> /// <returns>The <see cref="EventCallback"/>.</returns>
public static EventCallback<UIChangeEventArgs> Create(this EventCallbackFactory factory, object receiver, Func<UIChangeEventArgs, Task> callback) public static EventCallback<ChangeEventArgs> Create(this EventCallbackFactory factory, object receiver, Func<ChangeEventArgs, Task> callback)
{ {
if (factory == null) if (factory == null)
{ {
throw new ArgumentNullException(nameof(factory)); throw new ArgumentNullException(nameof(factory));
} }
return factory.Create<UIChangeEventArgs>(receiver, callback); return factory.Create<ChangeEventArgs>(receiver, callback);
} }
} }
} }

View File

@ -4,6 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
namespace Microsoft.AspNetCore.Components.Forms namespace Microsoft.AspNetCore.Components.Forms
{ {
@ -158,6 +159,16 @@ namespace Microsoft.AspNetCore.Components.Forms
} }
} }
/// <summary>
/// Gets the current validation messages for the specified field.
///
/// This method does not perform validation itself. It only returns messages determined by previous validation actions.
/// </summary>
/// <param name="accessor">Identifies the field whose current validation messages should be returned.</param>
/// <returns>The current validation messages for the specified field.</returns>
public IEnumerable<string> GetValidationMessages(Expression<Func<object>> accessor)
=> GetValidationMessages(FieldIdentifier.Create(accessor));
/// <summary> /// <summary>
/// Determines whether the specified fields in this <see cref="EditContext"/> has been modified. /// Determines whether the specified fields in this <see cref="EditContext"/> has been modified.
/// </summary> /// </summary>
@ -167,6 +178,14 @@ namespace Microsoft.AspNetCore.Components.Forms
? state.IsModified ? state.IsModified
: false; : false;
/// <summary>
/// Determines whether the specified fields in this <see cref="EditContext"/> has been modified.
/// </summary>
/// <param name="accessor">Identifies the field whose current validation messages should be returned.</param>
/// <returns>True if the field has been modified; otherwise false.</returns>
public bool IsModified(Expression<Func<object>> accessor)
=> IsModified(FieldIdentifier.Create(accessor));
/// <summary> /// <summary>
/// Validates this <see cref="EditContext"/>. /// Validates this <see cref="EditContext"/>.
/// </summary> /// </summary>

View File

@ -74,7 +74,7 @@ namespace Microsoft.AspNetCore.Components.Forms
Validator.TryValidateProperty(propertyValue, validationContext, results); Validator.TryValidateProperty(propertyValue, validationContext, results);
messages.Clear(fieldIdentifier); messages.Clear(fieldIdentifier);
messages.AddRange(fieldIdentifier, results.Select(result => result.ErrorMessage)); messages.Add(fieldIdentifier, results.Select(result => result.ErrorMessage));
// We have to notify even if there were no messages before and are still no messages now, // We have to notify even if there were no messages before and are still no messages now,
// because the "state" that changed might be the completion of some async validation task // because the "state" that changed might be the completion of some async validation task

View File

@ -1,35 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace Microsoft.AspNetCore.Components.Forms
{
/// <summary>
/// Provides extension methods to simplify using <see cref="EditContext"/> with expressions.
/// </summary>
public static class EditContextExpressionExtensions
{
/// <summary>
/// Gets the current validation messages for the specified field.
///
/// This method does not perform validation itself. It only returns messages determined by previous validation actions.
/// </summary>
/// <param name="editContext">The <see cref="EditContext"/>.</param>
/// <param name="accessor">Identifies the field whose current validation messages should be returned.</param>
/// <returns>The current validation messages for the specified field.</returns>
public static IEnumerable<string> GetValidationMessages(this EditContext editContext, Expression<Func<object>> accessor)
=> editContext.GetValidationMessages(FieldIdentifier.Create(accessor));
/// <summary>
/// Determines whether the specified fields in this <see cref="EditContext"/> has been modified.
/// </summary>
/// <param name="editContext">The <see cref="EditContext"/>.</param>
/// <param name="accessor">Identifies the field whose current validation messages should be returned.</param>
/// <returns>True if the field has been modified; otherwise false.</returns>
public static bool IsModified(this EditContext editContext, Expression<Func<object>> accessor)
=> editContext.IsModified(FieldIdentifier.Create(accessor));
}
}

View File

@ -1,21 +1,27 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace Microsoft.AspNetCore.Components.Forms namespace Microsoft.AspNetCore.Components.Forms
{ {
/// <summary> /// <summary>
/// Provides information about the <see cref="EditContext.OnFieldChanged"/> event. /// Provides information about the <see cref="EditContext.OnFieldChanged"/> event.
/// </summary> /// </summary>
public sealed class FieldChangedEventArgs public sealed class FieldChangedEventArgs : EventArgs
{ {
/// <summary>
/// Creates a new instance of <see cref="FieldChangedEventArgs"/>.
/// </summary>
/// <param name="fieldIdentifier">The <see cref="Forms.FieldIdentifier"/></param>
public FieldChangedEventArgs(in FieldIdentifier fieldIdentifier)
{
FieldIdentifier = fieldIdentifier;
}
/// <summary> /// <summary>
/// Identifies the field whose value has changed. /// Identifies the field whose value has changed.
/// </summary> /// </summary>
public FieldIdentifier FieldIdentifier { get; } public FieldIdentifier FieldIdentifier { get; }
internal FieldChangedEventArgs(in FieldIdentifier fieldIdentifier)
{
FieldIdentifier = fieldIdentifier;
}
} }
} }

View File

@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Components.Forms
/// Uniquely identifies a single field that can be edited. This may correspond to a property on a /// Uniquely identifies a single field that can be edited. This may correspond to a property on a
/// model object, or can be any other named value. /// model object, or can be any other named value.
/// </summary> /// </summary>
public readonly struct FieldIdentifier public readonly struct FieldIdentifier : IEquatable<FieldIdentifier>
{ {
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="FieldIdentifier"/> structure. /// Initializes a new instance of the <see cref="FieldIdentifier"/> structure.
@ -68,8 +68,15 @@ namespace Microsoft.AspNetCore.Components.Forms
/// <inheritdoc /> /// <inheritdoc />
public override bool Equals(object obj) public override bool Equals(object obj)
=> obj is FieldIdentifier otherIdentifier => obj is FieldIdentifier otherIdentifier
&& otherIdentifier.Model == Model && Equals(otherIdentifier);
&& string.Equals(otherIdentifier.FieldName, FieldName, StringComparison.Ordinal);
/// <inheritdoc />
public bool Equals(FieldIdentifier otherIdentifier)
{
return
otherIdentifier.Model == Model &&
string.Equals(otherIdentifier.FieldName, FieldName, StringComparison.Ordinal);
}
private static void ParseAccessor<T>(Expression<Func<T>> accessor, out object model, out string fieldName) private static void ParseAccessor<T>(Expression<Func<T>> accessor, out object model, out string fieldName)
{ {

View File

@ -33,14 +33,30 @@ namespace Microsoft.AspNetCore.Components.Forms
public void Add(in FieldIdentifier fieldIdentifier, string message) public void Add(in FieldIdentifier fieldIdentifier, string message)
=> GetOrCreateMessagesListForField(fieldIdentifier).Add(message); => GetOrCreateMessagesListForField(fieldIdentifier).Add(message);
/// <summary>
/// Adds a validation message for the specified field.
/// </summary>
/// <param name="accessor">Identifies the field for which to add the message.</param>
/// <param name="message">The validation message.</param>
public void Add(Expression<Func<object>> accessor, string message)
=> Add(FieldIdentifier.Create(accessor), message);
/// <summary> /// <summary>
/// Adds the messages from the specified collection for the specified field. /// Adds the messages from the specified collection for the specified field.
/// </summary> /// </summary>
/// <param name="fieldIdentifier">The identifier for the field.</param> /// <param name="fieldIdentifier">The identifier for the field.</param>
/// <param name="messages">The validation messages to be added.</param> /// <param name="messages">The validation messages to be added.</param>
public void AddRange(in FieldIdentifier fieldIdentifier, IEnumerable<string> messages) public void Add(in FieldIdentifier fieldIdentifier, IEnumerable<string> messages)
=> GetOrCreateMessagesListForField(fieldIdentifier).AddRange(messages); => GetOrCreateMessagesListForField(fieldIdentifier).AddRange(messages);
/// <summary>
/// Adds the messages from the specified collection for the specified field.
/// </summary>
/// <param name="accessor">Identifies the field for which to add the messages.</param>
/// <param name="messages">The validation messages to be added.</param>
public void Add(Expression<Func<object>> accessor, IEnumerable<string> messages)
=> Add(FieldIdentifier.Create(accessor), messages);
/// <summary> /// <summary>
/// Gets the validation messages within this <see cref="ValidationMessageStore"/> for the specified field. /// Gets the validation messages within this <see cref="ValidationMessageStore"/> for the specified field.
/// ///
@ -74,6 +90,13 @@ namespace Microsoft.AspNetCore.Components.Forms
_messages.Clear(); _messages.Clear();
} }
/// <summary>
/// Removes all messages within this <see cref="ValidationMessageStore"/> for the specified field.
/// </summary>
/// <param name="accessor">Identifies the field for which to remove the messages.</param>
public void Clear(Expression<Func<object>> accessor)
=> Clear(FieldIdentifier.Create(accessor));
/// <summary> /// <summary>
/// Removes all messages within this <see cref="ValidationMessageStore"/> for the specified field. /// Removes all messages within this <see cref="ValidationMessageStore"/> for the specified field.
/// </summary> /// </summary>

View File

@ -1,41 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace Microsoft.AspNetCore.Components.Forms
{
/// <summary>
/// Provides extension methods to simplify using <see cref="ValidationMessageStore"/> with expressions.
/// </summary>
public static class ValidationMessageStoreExpressionExtensions
{
/// <summary>
/// Adds a validation message for the specified field.
/// </summary>
/// <param name="store">The <see cref="ValidationMessageStore"/>.</param>
/// <param name="accessor">Identifies the field for which to add the message.</param>
/// <param name="message">The validation message.</param>
public static void Add(this ValidationMessageStore store, Expression<Func<object>> accessor, string message)
=> store.Add(FieldIdentifier.Create(accessor), message);
/// <summary>
/// Adds the messages from the specified collection for the specified field.
/// </summary>
/// <param name="store">The <see cref="ValidationMessageStore"/>.</param>
/// <param name="accessor">Identifies the field for which to add the messages.</param>
/// <param name="messages">The validation messages to be added.</param>
public static void AddRange(this ValidationMessageStore store, Expression<Func<object>> accessor, IEnumerable<string> messages)
=> store.AddRange(FieldIdentifier.Create(accessor), messages);
/// <summary>
/// Removes all messages within this <see cref="ValidationMessageStore"/> for the specified field.
/// </summary>
/// <param name="store">The <see cref="ValidationMessageStore"/>.</param>
/// <param name="accessor">Identifies the field for which to remove the messages.</param>
public static void Clear(this ValidationMessageStore store, Expression<Func<object>> accessor)
=> store.Clear(FieldIdentifier.Create(accessor));
}
}

View File

@ -1,16 +1,24 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace Microsoft.AspNetCore.Components.Forms namespace Microsoft.AspNetCore.Components.Forms
{ {
/// <summary> /// <summary>
/// Provides information about the <see cref="EditContext.OnValidationRequested"/> event. /// Provides information about the <see cref="EditContext.OnValidationRequested"/> event.
/// </summary> /// </summary>
public sealed class ValidationRequestedEventArgs public sealed class ValidationRequestedEventArgs : EventArgs
{ {
internal static readonly ValidationRequestedEventArgs Empty = new ValidationRequestedEventArgs(); /// <summary>
/// Gets a shared empty instance of <see cref="ValidationRequestedEventArgs"/>.
/// </summary>
public static new readonly ValidationRequestedEventArgs Empty = new ValidationRequestedEventArgs();
internal ValidationRequestedEventArgs() /// <summary>
/// Creates a new instance of <see cref="ValidationRequestedEventArgs"/>.
/// </summary>
public ValidationRequestedEventArgs()
{ {
} }
} }

View File

@ -1,16 +1,24 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace Microsoft.AspNetCore.Components.Forms namespace Microsoft.AspNetCore.Components.Forms
{ {
/// <summary> /// <summary>
/// Provides information about the <see cref="EditContext.OnValidationStateChanged"/> event. /// Provides information about the <see cref="EditContext.OnValidationStateChanged"/> event.
/// </summary> /// </summary>
public sealed class ValidationStateChangedEventArgs public sealed class ValidationStateChangedEventArgs : EventArgs
{ {
internal static readonly ValidationStateChangedEventArgs Empty = new ValidationStateChangedEventArgs(); /// <summary>
/// Gets a shared empty instance of <see cref="ValidationStateChangedEventArgs"/>.
/// </summary>
public new static readonly ValidationStateChangedEventArgs Empty = new ValidationStateChangedEventArgs();
internal ValidationStateChangedEventArgs() /// <summary>
/// Creates a new instance of <see cref="ValidationStateChangedEventArgs" />
/// </summary>
public ValidationStateChangedEventArgs()
{ {
} }
} }

View File

@ -1,64 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Components.Routing;
namespace Microsoft.AspNetCore.Components
{
/// <summary>
/// Helpers for working with URIs and navigation state.
/// </summary>
public interface IUriHelper
{
/// <summary>
/// Gets the current absolute URI.
/// </summary>
/// <returns>The current absolute URI.</returns>
string GetAbsoluteUri();
/// <summary>
/// An event that fires when the navigation location has changed.
/// </summary>
event EventHandler<LocationChangedEventArgs> OnLocationChanged;
/// <summary>
/// Converts a relative URI into an absolute one (by resolving it
/// relative to the current absolute URI).
/// </summary>
/// <param name="href">The relative URI.</param>
/// <returns>The absolute URI.</returns>
Uri ToAbsoluteUri(string href);
/// <summary>
/// Gets the base URI (with trailing slash) that can be prepended before relative URI paths to produce an absolute URI.
/// Typically this corresponds to the 'href' attribute on the document's &lt;base&gt; element.
/// </summary>
/// <returns>The URI prefix, which has a trailing slash.</returns>
string GetBaseUri();
/// <summary>
/// Given a base URI (e.g., one previously returned by <see cref="GetBaseUri"/>),
/// converts an absolute URI into one relative to the base URI prefix.
/// </summary>
/// <param name="baseUri">The base URI prefix (e.g., previously returned by <see cref="GetBaseUri"/>).</param>
/// <param name="locationAbsolute">An absolute URI that is within the space of the base URI.</param>
/// <returns>A relative URI path.</returns>
string ToBaseRelativePath(string baseUri, string locationAbsolute);
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="GetBaseUri"/>).</param>
void NavigateTo(string uri);
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="GetBaseUri"/>).</param>
/// <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
void NavigateTo(string uri, bool forceLoad);
}
}

View File

@ -0,0 +1,23 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace Microsoft.AspNetCore.Components
{
/// <summary>
/// An exception thrown when <see cref="NavigationManager.LocationChanged"/> throws an exception.
/// </summary>
public sealed class LocationChangeException : Exception
{
/// <summary>
/// Creates a new instance of <see cref="LocationChangeException"/>.
/// </summary>
/// <param name="message">The exception message.</param>
/// <param name="innerException">The inner exception.</param>
public LocationChangeException(string message, Exception innerException)
: base(message, innerException)
{
}
}
}

View File

@ -6,7 +6,7 @@ using System;
namespace Microsoft.AspNetCore.Components namespace Microsoft.AspNetCore.Components
{ {
/// <summary> /// <summary>
/// Exception thrown when an <see cref="IUriHelper"/> is not able to navigate to a different url. /// Exception thrown when an <see cref="NavigationManager"/> is not able to navigate to a different url.
/// </summary> /// </summary>
public class NavigationException : Exception public class NavigationException : Exception
{ {

View File

@ -0,0 +1,269 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Components.Routing;
namespace Microsoft.AspNetCore.Components
{
/// <summary>
/// Provides an abstraction for querying and mananging URI navigation.
/// </summary>
public abstract class NavigationManager
{
/// <summary>
/// An event that fires when the navigation location has changed.
/// </summary>
public event EventHandler<LocationChangedEventArgs> LocationChanged
{
add
{
AssertInitialized();
_locationChanged += value;
}
remove
{
AssertInitialized();
_locationChanged -= value;
}
}
private EventHandler<LocationChangedEventArgs> _locationChanged;
// For the baseUri it's worth storing as a System.Uri so we can do operations
// on that type. System.Uri gives us access to the original string anyway.
private Uri _baseUri;
// The URI. Always represented an absolute URI.
private string _uri;
private bool _isInitialized;
/// <summary>
/// Gets or sets the current base URI. The <see cref="BaseUri" /> is always represented as an absolute URI in string form with trailing slash.
/// Typically this corresponds to the 'href' attribute on the document's &lt;base&gt; element.
/// </summary>
/// <remarks>
/// Setting <see cref="BaseUri" /> will not trigger the <see cref="LocationChanged" /> event.
/// </remarks>
public string BaseUri
{
get
{
AssertInitialized();
return _baseUri.OriginalString;
}
protected set
{
if (value != null)
{
value = NormalizeBaseUri(value);
}
_baseUri = new Uri(value, UriKind.Absolute);
}
}
/// <summary>
/// Gets or sets the current URI. The <see cref="Uri" /> is always represented as an absolute URI in string form.
/// </summary>
/// <remarks>
/// Setting <see cref="Uri" /> will not trigger the <see cref="LocationChanged" /> event.
/// </remarks>
public string Uri
{
get
{
AssertInitialized();
return _uri;
}
protected set
{
Validate(_baseUri, value);
_uri = value;
}
}
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="BaseUri"/>).</param>
/// <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
public void NavigateTo(string uri, bool forceLoad = false)
{
AssertInitialized();
NavigateToCore(uri, forceLoad);
}
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="BaseUri"/>).</param>
/// <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
protected abstract void NavigateToCore(string uri, bool forceLoad);
/// <summary>
/// Called to initialize BaseURI and current URI before these values are used for the first time.
/// Override <see cref="EnsureInitialized" /> and call this method to dynamically calculate these values.
/// </summary>
protected void Initialize(string baseUri, string uri)
{
// Make sure it's possible/safe to call this method from constructors of derived classes.
if (uri == null)
{
throw new ArgumentNullException(nameof(uri));
}
if (baseUri == null)
{
throw new ArgumentNullException(nameof(baseUri));
}
if (_isInitialized)
{
throw new InvalidOperationException($"'{GetType().Name}' already initialized.");
}
_isInitialized = true;
// Setting BaseUri before Uri so they get validated.
BaseUri = baseUri;
Uri = uri;
}
/// <summary>
/// Allows derived classes to lazyly self-initialize. Implementations that support lazy-initialization should override
/// this method and call <see cref="Initialize(string, string)" />.
/// </summary>
protected virtual void EnsureInitialized()
{
}
/// <summary>
/// Converts a relative URI into an absolute one (by resolving it
/// relative to the current absolute URI).
/// </summary>
/// <param name="relativeUri">The relative URI.</param>
/// <returns>The absolute URI.</returns>
public Uri ToAbsoluteUri(string relativeUri)
{
AssertInitialized();
return new Uri(_baseUri, relativeUri);
}
/// <summary>
/// Given a base URI (e.g., one previously returned by <see cref="BaseUri"/>),
/// converts an absolute URI into one relative to the base URI prefix.
/// </summary>
/// <param name="uri">An absolute URI that is within the space of the base URI.</param>
/// <returns>A relative URI path.</returns>
public string ToBaseRelativePath(string uri)
{
if (uri.StartsWith(_baseUri.OriginalString, StringComparison.Ordinal))
{
// The absolute URI must be of the form "{baseUri}something" (where
// baseUri ends with a slash), and from that we return "something"
return uri.Substring(_baseUri.OriginalString.Length);
}
var hashIndex = uri.IndexOf('#');
var uriWithoutHash = hashIndex < 0 ? uri : uri.Substring(0, hashIndex);
if ($"{uriWithoutHash}/".Equals(_baseUri.OriginalString, StringComparison.Ordinal))
{
// Special case: for the base URI "/something/", if you're at
// "/something" then treat it as if you were at "/something/" (i.e.,
// with the trailing slash). It's a bit ambiguous because we don't know
// whether the server would return the same page whether or not the
// slash is present, but ASP.NET Core at least does by default when
// using PathBase.
return uri.Substring(_baseUri.OriginalString.Length - 1);
}
var message = $"The URI '{uri}' is not contained by the base URI '{_baseUri}'.";
throw new ArgumentException(message);
}
internal static string NormalizeBaseUri(string baseUri)
{
var lastSlashIndex = baseUri.LastIndexOf('/');
if (lastSlashIndex >= 0)
{
baseUri = baseUri.Substring(0, lastSlashIndex + 1);
}
return baseUri;
}
/// <summary>
/// Triggers the <see cref="LocationChanged"/> event with the current URI value.
/// </summary>
protected void NotifyLocationChanged(bool isInterceptedLink)
{
try
{
_locationChanged?.Invoke(this, new LocationChangedEventArgs(_uri, isInterceptedLink));
}
catch (Exception ex)
{
throw new LocationChangeException("An exception occurred while dispatching a location changed event.", ex);
}
}
private void AssertInitialized()
{
if (!_isInitialized)
{
EnsureInitialized();
}
if (!_isInitialized)
{
throw new InvalidOperationException($"'{GetType().Name}' has not been initialized.");
}
}
private static bool TryGetLengthOfBaseUriPrefix(Uri baseUri, string uri, out int length)
{
if (uri.StartsWith(baseUri.OriginalString, StringComparison.Ordinal))
{
// The absolute URI must be of the form "{baseUri}something" (where
// baseUri ends with a slash), and from that we return "something"
length = baseUri.OriginalString.Length;
return true;
}
var hashIndex = uri.IndexOf('#');
var uriWithoutHash = hashIndex < 0 ? uri : uri.Substring(0, hashIndex);
if ($"{uriWithoutHash}/".Equals(baseUri.OriginalString, StringComparison.Ordinal))
{
// Special case: for the base URI "/something/", if you're at
// "/something" then treat it as if you were at "/something/" (i.e.,
// with the trailing slash). It's a bit ambiguous because we don't know
// whether the server would return the same page whether or not the
// slash is present, but ASP.NET Core at least does by default when
// using PathBase.
length = baseUri.OriginalString.Length - 1;
return true;
}
length = 0;
return false;
}
private static void Validate(Uri baseUri, string uri)
{
if (baseUri == null || uri == null)
{
return;
}
if (!TryGetLengthOfBaseUriPrefix(baseUri, uri, out _))
{
var message = $"The URI '{uri}' is not contained by the base URI '{baseUri}'.";
throw new ArgumentException(message);
}
}
}
}

View File

@ -0,0 +1,100 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Components
{
/// <summary>
/// A base class that creates a service provider scope.
/// </summary>
/// <remarks>
/// Use the <see cref="OwningComponentBase"/> class as a base class to author components that control
/// the lifetime of a service provider scope. This is useful when using a transient or scoped service that
/// requires disposal such as a repository or database abstraction. Using <see cref="OwningComponentBase"/>
/// as a base class ensures that the service provider scope is disposed with the component.
/// </remarks>
public abstract class OwningComponentBase : ComponentBase, IDisposable
{
private IServiceScope _scope;
[Inject] IServiceScopeFactory ScopeFactory { get; set; }
/// <summary>
/// Gets a value determining if the component and associated services have been disposed.
/// </summary>
protected bool IsDisposed { get; private set; }
/// <summary>
/// Gets the scoped <see cref="IServiceProvider"/> that is associated with this component.
/// </summary>
protected IServiceProvider ScopedServices
{
get
{
if (ScopeFactory == null)
{
throw new InvalidOperationException("Services cannot be accessed before the component is initialized.");
}
if (IsDisposed)
{
throw new ObjectDisposedException(GetType().Name);
}
_scope ??= ScopeFactory.CreateScope();
return _scope.ServiceProvider;
}
}
void IDisposable.Dispose()
{
if (!IsDisposed)
{
_scope?.Dispose();
_scope = null;
Dispose(disposing: true);
IsDisposed = true;
}
}
/// <inheritdoc />
protected virtual void Dispose(bool disposing)
{
}
}
/// <summary>
/// A base class that creates a service provider scope, and resolves a service of type <typeparamref name="TService"/>.
/// </summary>
/// <typeparam name="TService">The service type.</typeparam>
/// <remarks>
/// Use the <see cref="OwningComponentBase{TService}"/> class as a base class to author components that control
/// the lifetime of a service or multiple services. This is useful when using a transient or scoped service that
/// requires disposal such as a repository or database abstraction. Using <see cref="OwningComponentBase{TService}"/>
/// as a base class ensures that the service and relates services that share its scope are disposed with the component.
/// </remarks>
public abstract class OwningComponentBase<TService> : OwningComponentBase, IDisposable
{
private TService _item;
/// <summary>
/// Gets the <typeparamref name="TService"/> that is associated with this component.
/// </summary>
protected TService Service
{
get
{
if (IsDisposed)
{
throw new ObjectDisposedException(GetType().Name);
}
// We cache this because we don't know the lifetime. We have to assume that it could be transient.
_item ??= ScopedServices.GetRequiredService<TService>();
return _item;
}
}
}
}

View File

@ -36,13 +36,13 @@ namespace Microsoft.AspNetCore.Components
/// The content that will be displayed if the user is not authorized. /// The content that will be displayed if the user is not authorized.
/// </summary> /// </summary>
[Parameter] [Parameter]
public RenderFragment<AuthenticationState> NotAuthorizedContent { get; set; } public RenderFragment<AuthenticationState> NotAuthorized { get; set; }
/// <summary> /// <summary>
/// The content that will be displayed while asynchronous authorization is in progress. /// The content that will be displayed while asynchronous authorization is in progress.
/// </summary> /// </summary>
[Parameter] [Parameter]
public RenderFragment AuthorizingContent { get; set; } public RenderFragment Authorizing { get; set; }
/// <inheritdoc /> /// <inheritdoc />
public void Attach(RenderHandle renderHandle) public void Attach(RenderHandle renderHandle)
@ -109,14 +109,14 @@ namespace Microsoft.AspNetCore.Components
} }
// Some authorization data exists, so we do need to wrap the fragment // Some authorization data exists, so we do need to wrap the fragment
RenderFragment<AuthenticationState> authorizedContent = context => pageFragment; RenderFragment<AuthenticationState> authorized = context => pageFragment;
return builder => return builder =>
{ {
builder.OpenComponent<AuthorizeViewWithSuppliedData>(0); builder.OpenComponent<AuthorizeViewWithSuppliedData>(0);
builder.AddAttribute(1, nameof(AuthorizeViewWithSuppliedData.AuthorizeDataParam), authorizeData); builder.AddAttribute(1, nameof(AuthorizeViewWithSuppliedData.AuthorizeDataParam), authorizeData);
builder.AddAttribute(2, nameof(AuthorizeViewWithSuppliedData.Authorized), authorizedContent); builder.AddAttribute(2, nameof(AuthorizeViewWithSuppliedData.Authorized), authorized);
builder.AddAttribute(3, nameof(AuthorizeViewWithSuppliedData.NotAuthorized), NotAuthorizedContent ?? DefaultNotAuthorizedContent); builder.AddAttribute(3, nameof(AuthorizeViewWithSuppliedData.NotAuthorized), NotAuthorized ?? DefaultNotAuthorized);
builder.AddAttribute(4, nameof(AuthorizeViewWithSuppliedData.Authorizing), AuthorizingContent); builder.AddAttribute(4, nameof(AuthorizeViewWithSuppliedData.Authorizing), Authorizing);
builder.CloseComponent(); builder.CloseComponent();
}; };
} }
@ -133,7 +133,7 @@ namespace Microsoft.AspNetCore.Components
// There has to be some default content. If we render blank by default, developers // There has to be some default content. If we render blank by default, developers
// will find it hard to guess why their UI isn't appearing. // will find it hard to guess why their UI isn't appearing.
private static RenderFragment DefaultNotAuthorizedContent(AuthenticationState authenticationState) private static RenderFragment DefaultNotAuthorized(AuthenticationState authenticationState)
=> builder => builder.AddContent(0, "Not authorized"); => builder => builder.AddContent(0, "Not authorized");
} }
} }

View File

@ -99,6 +99,10 @@ namespace Microsoft.AspNetCore.Components.RenderTree
if (oldKey != null || newKey != null) if (oldKey != null || newKey != null)
{ {
#region "Get diff action by matching on key" #region "Get diff action by matching on key"
// Regardless of whether these two keys match, since you are using keys, we want to validate at this point that there are no clashes
// so ensure we've built the dictionary that will be used for lookups if any don't match
keyedItemInfos ??= BuildKeyToInfoLookup(diffContext, origOldStartIndex, oldEndIndexExcl, origNewStartIndex, newEndIndexExcl);
if (Equals(oldKey, newKey)) if (Equals(oldKey, newKey))
{ {
// Keys match // Keys match
@ -108,11 +112,6 @@ namespace Microsoft.AspNetCore.Components.RenderTree
else else
{ {
// Keys don't match // Keys don't match
if (keyedItemInfos == null)
{
keyedItemInfos = BuildKeyToInfoLookup(diffContext, origOldStartIndex, oldEndIndexExcl, origNewStartIndex, newEndIndexExcl);
}
var oldKeyItemInfo = oldKey != null ? keyedItemInfos[oldKey] : new KeyedItemInfo(-1, -1); var oldKeyItemInfo = oldKey != null ? keyedItemInfos[oldKey] : new KeyedItemInfo(-1, -1);
var newKeyItemInfo = newKey != null ? keyedItemInfos[newKey] : new KeyedItemInfo(-1, -1); var newKeyItemInfo = newKey != null ? keyedItemInfos[newKey] : new KeyedItemInfo(-1, -1);
var oldKeyIsInNewTree = oldKeyItemInfo.NewIndex >= 0; var oldKeyIsInNewTree = oldKeyItemInfo.NewIndex >= 0;

View File

@ -5,6 +5,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.ExceptionServices; using System.Runtime.ExceptionServices;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.RenderTree; using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -21,6 +22,8 @@ namespace Microsoft.AspNetCore.Components.Rendering
"area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr" "area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"
}; };
private static readonly Task CanceledRenderTask = Task.FromCanceled(new CancellationToken(canceled: true));
private readonly Func<string, string> _htmlEncoder; private readonly Func<string, string> _htmlEncoder;
/// <summary> /// <summary>
@ -40,7 +43,19 @@ namespace Microsoft.AspNetCore.Components.Rendering
/// <inheritdoc /> /// <inheritdoc />
protected override Task UpdateDisplayAsync(in RenderBatch renderBatch) protected override Task UpdateDisplayAsync(in RenderBatch renderBatch)
{ {
return Task.CompletedTask; // By default we return a canceled task. This has the effect of making it so that the
// OnAfterRenderAsync callbacks on components don't run by default.
// This way, by default prerendering gets the correct behavior and other renderers
// override the UpdateDisplayAsync method already, so those components can
// either complete a task when the client acknowledges the render, or return a canceled task
// when the renderer gets disposed.
// We believe that returning a canceled task is the right behavior as we expect that any class
// that subclasses this class to provide an implementation for a given rendering scenario respects
// the contract that OnAfterRender should only be called when the display has successfully been updated
// and the application is interactive. (Element and component references are populated and JavaScript interop
// is available).
return CanceledRenderTask;
} }
/// <summary> /// <summary>

View File

@ -56,9 +56,9 @@ namespace Microsoft.AspNetCore.Components.Rendering
} }
} }
internal static void HandlingEvent(ILogger<Renderer> logger, ulong eventHandlerId, UIEventArgs eventArgs) internal static void HandlingEvent(ILogger<Renderer> logger, ulong eventHandlerId, EventArgs eventArgs)
{ {
_handlingEvent(logger, eventHandlerId, eventArgs?.Type ?? "null", null); _handlingEvent(logger, eventHandlerId, eventArgs?.GetType().Name ?? "null", null);
} }
} }
} }

View File

@ -206,7 +206,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
/// A <see cref="Task"/> which will complete once all asynchronous processing related to the event /// A <see cref="Task"/> which will complete once all asynchronous processing related to the event
/// has completed. /// has completed.
/// </returns> /// </returns>
public virtual Task DispatchEventAsync(ulong eventHandlerId, EventFieldInfo fieldInfo, UIEventArgs eventArgs) public virtual Task DispatchEventAsync(ulong eventHandlerId, EventFieldInfo fieldInfo, EventArgs eventArgs)
{ {
EnsureSynchronizationContext(); EnsureSynchronizationContext();
@ -445,8 +445,12 @@ namespace Microsoft.AspNetCore.Components.Rendering
{ {
if (updateDisplayTask.IsCanceled) if (updateDisplayTask.IsCanceled)
{ {
// The display update was cancelled (maybe due to a timeout on the components server-side case or due // The display update was canceled.
// to the renderer being disposed) // This can be due to a timeout on the components server-side case, or the renderer being disposed.
// The latter case is normal during prerendering, as the render never fully completes (the display never
// gets updated, no references get populated and JavaScript interop is not available) and we simply discard
// the renderer after producing the prerendered content.
return Task.CompletedTask; return Task.CompletedTask;
} }
if (updateDisplayTask.IsFaulted) if (updateDisplayTask.IsFaulted)

View File

@ -0,0 +1,19 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNetCore.Components.Routing
{
/// <summary>
/// An optional interface for <see cref="NavigationManager" /> implementations that must be initialized
/// by the host.
/// </summary>
public interface IHostEnvironmentNavigationManager
{
/// <summary>
/// Initializes the <see cref="NavigationManager" />.
/// </summary>
/// <param name="baseUri">The base URI.</param>
/// <param name="uri">The absolute URI.</param>
void Initialize(string baseUri, string uri);
}
}

View File

@ -6,9 +6,9 @@ using System;
namespace Microsoft.AspNetCore.Components.Routing namespace Microsoft.AspNetCore.Components.Routing
{ {
/// <summary> /// <summary>
/// <see cref="EventArgs" /> for <see cref="IUriHelper.OnLocationChanged" />. /// <see cref="EventArgs" /> for <see cref="NavigationManager.LocationChanged" />.
/// </summary> /// </summary>
public readonly struct LocationChangedEventArgs public class LocationChangedEventArgs : EventArgs
{ {
/// <summary> /// <summary>
/// Initializes a new instance of <see cref="LocationChangedEventArgs" />. /// Initializes a new instance of <see cref="LocationChangedEventArgs" />.

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Components.Routing
bool _navigationInterceptionEnabled; bool _navigationInterceptionEnabled;
ILogger<Router> _logger; ILogger<Router> _logger;
[Inject] private IUriHelper UriHelper { get; set; } [Inject] private NavigationManager NavigationManager { get; set; }
[Inject] private INavigationInterception NavigationInterception { get; set; } [Inject] private INavigationInterception NavigationInterception { get; set; }
@ -41,17 +41,17 @@ namespace Microsoft.AspNetCore.Components.Routing
/// <summary> /// <summary>
/// Gets or sets the type of the component that should be used as a fallback when no match is found for the requested route. /// Gets or sets the type of the component that should be used as a fallback when no match is found for the requested route.
/// </summary> /// </summary>
[Parameter] public RenderFragment NotFoundContent { get; set; } [Parameter] public RenderFragment NotFound { get; set; }
/// <summary> /// <summary>
/// The content that will be displayed if the user is not authorized. /// The content that will be displayed if the user is not authorized.
/// </summary> /// </summary>
[Parameter] public RenderFragment<AuthenticationState> NotAuthorizedContent { get; set; } [Parameter] public RenderFragment<AuthenticationState> NotAuthorized { get; set; }
/// <summary> /// <summary>
/// The content that will be displayed while asynchronous authorization is in progress. /// The content that will be displayed while asynchronous authorization is in progress.
/// </summary> /// </summary>
[Parameter] public RenderFragment AuthorizingContent { get; set; } [Parameter] public RenderFragment Authorizing { get; set; }
private RouteTable Routes { get; set; } private RouteTable Routes { get; set; }
@ -60,9 +60,9 @@ namespace Microsoft.AspNetCore.Components.Routing
{ {
_logger = LoggerFactory.CreateLogger<Router>(); _logger = LoggerFactory.CreateLogger<Router>();
_renderHandle = renderHandle; _renderHandle = renderHandle;
_baseUri = UriHelper.GetBaseUri(); _baseUri = NavigationManager.BaseUri;
_locationAbsolute = UriHelper.GetAbsoluteUri(); _locationAbsolute = NavigationManager.Uri;
UriHelper.OnLocationChanged += OnLocationChanged; NavigationManager.LocationChanged += OnLocationChanged;
} }
/// <inheritdoc /> /// <inheritdoc />
@ -77,7 +77,7 @@ namespace Microsoft.AspNetCore.Components.Routing
/// <inheritdoc /> /// <inheritdoc />
public void Dispose() public void Dispose()
{ {
UriHelper.OnLocationChanged -= OnLocationChanged; NavigationManager.LocationChanged -= OnLocationChanged;
} }
private string StringUntilAny(string str, char[] chars) private string StringUntilAny(string str, char[] chars)
@ -94,14 +94,14 @@ namespace Microsoft.AspNetCore.Components.Routing
builder.OpenComponent(0, typeof(PageDisplay)); builder.OpenComponent(0, typeof(PageDisplay));
builder.AddAttribute(1, nameof(PageDisplay.Page), handler); builder.AddAttribute(1, nameof(PageDisplay.Page), handler);
builder.AddAttribute(2, nameof(PageDisplay.PageParameters), parameters); builder.AddAttribute(2, nameof(PageDisplay.PageParameters), parameters);
builder.AddAttribute(3, nameof(PageDisplay.NotAuthorizedContent), NotAuthorizedContent); builder.AddAttribute(3, nameof(PageDisplay.NotAuthorized), NotAuthorized);
builder.AddAttribute(4, nameof(PageDisplay.AuthorizingContent), AuthorizingContent); builder.AddAttribute(4, nameof(PageDisplay.Authorizing), Authorizing);
builder.CloseComponent(); builder.CloseComponent();
} }
private void Refresh(bool isNavigationIntercepted) private void Refresh(bool isNavigationIntercepted)
{ {
var locationPath = UriHelper.ToBaseRelativePath(_baseUri, _locationAbsolute); var locationPath = NavigationManager.ToBaseRelativePath(_locationAbsolute);
locationPath = StringUntilAny(locationPath, _queryOrHashStartChar); locationPath = StringUntilAny(locationPath, _queryOrHashStartChar);
var context = new RouteContext(locationPath); var context = new RouteContext(locationPath);
Routes.Route(context); Routes.Route(context);
@ -120,19 +120,19 @@ namespace Microsoft.AspNetCore.Components.Routing
} }
else else
{ {
if (!isNavigationIntercepted && NotFoundContent != null) if (!isNavigationIntercepted && NotFound != null)
{ {
Log.DisplayingNotFoundContent(_logger, locationPath, _baseUri); Log.DisplayingNotFound(_logger, locationPath, _baseUri);
// We did not find a Component that matches the route. // We did not find a Component that matches the route.
// Only show the NotFoundContent if the application developer programatically got us here i.e we did not // Only show the NotFound if the application developer programatically got us here i.e we did not
// intercept the navigation. In all other cases, force a browser navigation since this could be non-Blazor content. // intercept the navigation. In all other cases, force a browser navigation since this could be non-Blazor content.
_renderHandle.Render(NotFoundContent); _renderHandle.Render(NotFound);
} }
else else
{ {
Log.NavigatingToExternalUri(_logger, _locationAbsolute, locationPath, _baseUri); Log.NavigatingToExternalUri(_logger, _locationAbsolute, locationPath, _baseUri);
UriHelper.NavigateTo(_locationAbsolute, forceLoad: true); NavigationManager.NavigateTo(_locationAbsolute, forceLoad: true);
} }
} }
} }
@ -159,8 +159,8 @@ namespace Microsoft.AspNetCore.Components.Routing
private static class Log private static class Log
{ {
private static readonly Action<ILogger, string, string, Exception> _displayingNotFoundContent = private static readonly Action<ILogger, string, string, Exception> _displayingNotFound =
LoggerMessage.Define<string, string>(LogLevel.Debug, new EventId(1, "DisplayingNotFoundContent"), $"Displaying {nameof(NotFoundContent)} because path '{{Path}}' with base URI '{{BaseUri}}' does not match any component route"); LoggerMessage.Define<string, string>(LogLevel.Debug, new EventId(1, "DisplayingNotFound"), $"Displaying {nameof(NotFound)} because path '{{Path}}' with base URI '{{BaseUri}}' does not match any component route");
private static readonly Action<ILogger, Type, string, string, Exception> _navigatingToComponent = private static readonly Action<ILogger, Type, string, string, Exception> _navigatingToComponent =
LoggerMessage.Define<Type, string, string>(LogLevel.Debug, new EventId(2, "NavigatingToComponent"), "Navigating to component {ComponentType} in response to path '{Path}' with base URI '{BaseUri}'"); LoggerMessage.Define<Type, string, string>(LogLevel.Debug, new EventId(2, "NavigatingToComponent"), "Navigating to component {ComponentType} in response to path '{Path}' with base URI '{BaseUri}'");
@ -168,9 +168,9 @@ namespace Microsoft.AspNetCore.Components.Routing
private static readonly Action<ILogger, string, string, string, Exception> _navigatingToExternalUri = private static readonly Action<ILogger, string, string, string, Exception> _navigatingToExternalUri =
LoggerMessage.Define<string, string, string>(LogLevel.Debug, new EventId(3, "NavigatingToExternalUri"), "Navigating to non-component URI '{ExternalUri}' in response to path '{Path}' with base URI '{BaseUri}'"); LoggerMessage.Define<string, string, string>(LogLevel.Debug, new EventId(3, "NavigatingToExternalUri"), "Navigating to non-component URI '{ExternalUri}' in response to path '{Path}' with base URI '{BaseUri}'");
internal static void DisplayingNotFoundContent(ILogger logger, string path, string baseUri) internal static void DisplayingNotFound(ILogger logger, string path, string baseUri)
{ {
_displayingNotFoundContent(logger, path, baseUri, null); _displayingNotFound(logger, path, baseUri, null);
} }
internal static void NavigatingToComponent(ILogger logger, Type componentType, string path, string baseUri) internal static void NavigatingToComponent(ILogger logger, Type componentType, string path, string baseUri)

View File

@ -1,17 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNetCore.Components
{
/// <summary>
/// Supplies information about an input change event that is being raised.
/// </summary>
public class UIChangeEventArgs : UIEventArgs
{
/// <summary>
/// Gets or sets the new value of the input. This may be a <see cref="string"/>
/// or a <see cref="bool"/>.
/// </summary>
public object Value { get; set; }
}
}

View File

@ -1,230 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Components.Routing;
namespace Microsoft.AspNetCore.Components
{
/// <summary>
/// A base class for <see cref="IUriHelper"/> implementations.
/// </summary>
public abstract class UriHelperBase : IUriHelper
{
private EventHandler<LocationChangedEventArgs> _onLocationChanged;
/// <summary>
/// An event that fires when the navigation location has changed.
/// </summary>
public event EventHandler<LocationChangedEventArgs> OnLocationChanged
{
add
{
AssertInitialized();
_onLocationChanged += value;
}
remove
{
_onLocationChanged -= value;
}
}
// For the baseUri it's worth storing both the string form and Uri form and
// keeping them in sync. These are always represented as absolute URIs with
// a trailing slash.
private Uri _baseUri;
private string _baseUriString;
// The URI. Always represented an absolute URI.
private string _uri;
private bool _isInitialized;
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="GetBaseUri"/>).</param>
public void NavigateTo(string uri)
{
NavigateTo(uri, forceLoad: false);
}
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="GetBaseUri"/>).</param>
/// <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
public void NavigateTo(string uri, bool forceLoad)
{
AssertInitialized();
NavigateToCore(uri, forceLoad);
}
/// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
/// (as returned by <see cref="GetBaseUri"/>).</param>
/// <param name="forceLoad">If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.</param>
protected abstract void NavigateToCore(string uri, bool forceLoad);
/// <summary>
/// Called to initialize BaseURI and current URI before these values are used for the first time.
/// Override this method to dynamically calculate these values.
/// </summary>
public virtual void InitializeState(string uriAbsolute, string baseUriAbsolute)
{
if (uriAbsolute == null)
{
throw new ArgumentNullException(nameof(uriAbsolute));
}
if (baseUriAbsolute == null)
{
throw new ArgumentNullException(nameof(baseUriAbsolute));
}
if (_isInitialized)
{
throw new InvalidOperationException($"'{typeof(UriHelperBase).Name}' already initialized.");
}
_isInitialized = true;
SetAbsoluteUri(uriAbsolute);
SetAbsoluteBaseUri(baseUriAbsolute);
}
/// <summary>
/// Allows derived classes to lazyly self initialize. It does nothing unless overriden.
/// </summary>
protected virtual void EnsureInitialized()
{
}
/// <summary>
/// Gets the current absolute URI.
/// </summary>
/// <returns>The current absolute URI.</returns>
public string GetAbsoluteUri()
{
AssertInitialized();
return _uri;
}
/// <summary>
/// Gets the base URI (with trailing slash) that can be prepended before relative URI paths to
/// produce an absolute URI. Typically this corresponds to the 'href' attribute on the
/// document's &lt;base&gt; element.
/// </summary>
/// <returns>The URI prefix, which has a trailing slash.</returns>
public virtual string GetBaseUri()
{
AssertInitialized();
return _baseUriString;
}
/// <summary>
/// Converts a relative URI into an absolute one (by resolving it
/// relative to the current absolute URI).
/// </summary>
/// <param name="href">The relative URI.</param>
/// <returns>The absolute URI.</returns>
public Uri ToAbsoluteUri(string href)
{
AssertInitialized();
return new Uri(_baseUri, href);
}
/// <summary>
/// Given a base URI (e.g., one previously returned by <see cref="GetBaseUri"/>),
/// converts an absolute URI into one relative to the base URI prefix.
/// </summary>
/// <param name="baseUri">
/// The base URI prefix (e.g., previously returned by <see cref="GetBaseUri"/>).
/// </param>
/// <param name="locationAbsolute">An absolute URI that is within the space of the base URI.</param>
/// <returns>A relative URI path.</returns>
public string ToBaseRelativePath(string baseUri, string locationAbsolute)
{
if (locationAbsolute.StartsWith(baseUri, StringComparison.Ordinal))
{
// The absolute URI must be of the form "{baseUri}something" (where
// baseUri ends with a slash), and from that we return "something"
return locationAbsolute.Substring(baseUri.Length);
}
var hashIndex = locationAbsolute.IndexOf('#');
var locationAbsoluteNoHash = hashIndex < 0 ? locationAbsolute : locationAbsolute.Substring(0, hashIndex);
if ($"{locationAbsoluteNoHash}/".Equals(baseUri, StringComparison.Ordinal))
{
// Special case: for the base URI "/something/", if you're at
// "/something" then treat it as if you were at "/something/" (i.e.,
// with the trailing slash). It's a bit ambiguous because we don't know
// whether the server would return the same page whether or not the
// slash is present, but ASP.NET Core at least does by default when
// using PathBase.
return locationAbsolute.Substring(baseUri.Length - 1);
}
var message = $"The URI '{locationAbsolute}' is not contained by the base URI '{baseUri}'.";
throw new ArgumentException(message);
}
/// <summary>
/// Set the URI to the provided value.
/// </summary>
/// <param name="uri">The URI. Must be an absolute URI.</param>
/// <remarks>
/// Calling <see cref="SetAbsoluteUri(string)"/> does not trigger <see cref="OnLocationChanged"/>.
/// </remarks>
protected void SetAbsoluteUri(string uri)
{
_uri = uri;
}
/// <summary>
/// Sets the base URI to the provided value (after normalization).
/// </summary>
/// <param name="baseUri">The base URI. Must be an absolute URI.</param>
/// <remarks>
/// Calling <see cref="SetAbsoluteBaseUri(string)"/> does not trigger <see cref="OnLocationChanged"/>.
/// </remarks>
protected void SetAbsoluteBaseUri(string baseUri)
{
if (baseUri != null)
{
var lastSlashIndex = baseUri.LastIndexOf('/');
if (lastSlashIndex >= 0)
{
baseUri = baseUri.Substring(0, lastSlashIndex + 1);
}
}
_baseUriString = baseUri ?? "/";
_baseUri = new Uri(_baseUriString);
}
/// <summary>
/// Triggers the <see cref="OnLocationChanged"/> event with the current URI value.
/// </summary>
protected void TriggerOnLocationChanged(bool isinterceptedLink)
{
_onLocationChanged?.Invoke(this, new LocationChangedEventArgs(_uri, isinterceptedLink));
}
private void AssertInitialized()
{
if (!_isInitialized)
{
EnsureInitialized();
}
if (!_isInitialized)
{
throw new InvalidOperationException($"'{GetType().Name}' has not been initialized.");
}
}
}
}

View File

@ -53,13 +53,13 @@ namespace Microsoft.AspNetCore.Components
} }
[Fact] [Fact]
public void RendersNotAuthorizedContentIfNotAuthorized() public void RendersNotAuthorizedIfNotAuthorized()
{ {
// Arrange // Arrange
var authorizationService = new TestAuthorizationService(); var authorizationService = new TestAuthorizationService();
var renderer = CreateTestRenderer(authorizationService); var renderer = CreateTestRenderer(authorizationService);
var rootComponent = WrapInAuthorizeView( var rootComponent = WrapInAuthorizeView(
notAuthorizedContent: notAuthorized:
context => builder => builder.AddContent(0, $"You are not authorized, even though we know you are {context.User.Identity.Name}")); context => builder => builder.AddContent(0, $"You are not authorized, even though we know you are {context.User.Identity.Name}"));
rootComponent.AuthenticationState = CreateAuthenticationState("Nellie"); rootComponent.AuthenticationState = CreateAuthenticationState("Nellie");
@ -88,7 +88,7 @@ namespace Microsoft.AspNetCore.Components
} }
[Fact] [Fact]
public void RendersNothingIfAuthorizedButNoChildContentOrAuthorizedContentProvided() public void RendersNothingIfAuthorizedButNoChildContentOrAuthorizedProvided()
{ {
// Arrange // Arrange
var authorizationService = new TestAuthorizationService(); var authorizationService = new TestAuthorizationService();
@ -152,14 +152,14 @@ namespace Microsoft.AspNetCore.Components
} }
[Fact] [Fact]
public void RendersAuthorizedContentIfAuthorized() public void RendersAuthorizedIfAuthorized()
{ {
// Arrange // Arrange
var authorizationService = new TestAuthorizationService(); var authorizationService = new TestAuthorizationService();
authorizationService.NextResult = AuthorizationResult.Success(); authorizationService.NextResult = AuthorizationResult.Success();
var renderer = CreateTestRenderer(authorizationService); var renderer = CreateTestRenderer(authorizationService);
var rootComponent = WrapInAuthorizeView( var rootComponent = WrapInAuthorizeView(
authorizedContent: context => builder => authorized: context => builder =>
builder.AddContent(0, $"You are authenticated as {context.User.Identity.Name}")); builder.AddContent(0, $"You are authenticated as {context.User.Identity.Name}"));
rootComponent.AuthenticationState = CreateAuthenticationState("Nellie"); rootComponent.AuthenticationState = CreateAuthenticationState("Nellie");
@ -235,13 +235,13 @@ namespace Microsoft.AspNetCore.Components
} }
[Fact] [Fact]
public void ThrowsIfBothChildContentAndAuthorizedContentProvided() public void ThrowsIfBothChildContentAndAuthorizedProvided()
{ {
// Arrange // Arrange
var authorizationService = new TestAuthorizationService(); var authorizationService = new TestAuthorizationService();
var renderer = CreateTestRenderer(authorizationService); var renderer = CreateTestRenderer(authorizationService);
var rootComponent = WrapInAuthorizeView( var rootComponent = WrapInAuthorizeView(
authorizedContent: context => builder => { }, authorized: context => builder => { },
childContent: context => builder => { }); childContent: context => builder => { });
// Act/Assert // Act/Assert
@ -260,7 +260,7 @@ namespace Microsoft.AspNetCore.Components
var renderer = CreateTestRenderer(authorizationService); var renderer = CreateTestRenderer(authorizationService);
renderer.OnUpdateDisplayComplete = () => { @event.Set(); }; renderer.OnUpdateDisplayComplete = () => { @event.Set(); };
var rootComponent = WrapInAuthorizeView( var rootComponent = WrapInAuthorizeView(
notAuthorizedContent: notAuthorized:
context => builder => builder.AddContent(0, "You are not authorized")); context => builder => builder.AddContent(0, "You are not authorized"));
var authTcs = new TaskCompletionSource<AuthenticationState>(); var authTcs = new TaskCompletionSource<AuthenticationState>();
rootComponent.AuthenticationState = authTcs.Task; rootComponent.AuthenticationState = authTcs.Task;
@ -293,7 +293,7 @@ namespace Microsoft.AspNetCore.Components
} }
[Fact] [Fact]
public void RendersAuthorizingContentUntilAuthorizationCompleted() public void RendersAuthorizingUntilAuthorizationCompleted()
{ {
// Arrange // Arrange
var @event = new ManualResetEventSlim(); var @event = new ManualResetEventSlim();
@ -302,8 +302,8 @@ namespace Microsoft.AspNetCore.Components
var renderer = CreateTestRenderer(authorizationService); var renderer = CreateTestRenderer(authorizationService);
renderer.OnUpdateDisplayComplete = () => { @event.Set(); }; renderer.OnUpdateDisplayComplete = () => { @event.Set(); };
var rootComponent = WrapInAuthorizeView( var rootComponent = WrapInAuthorizeView(
authorizingContent: builder => builder.AddContent(0, "Auth pending..."), authorizing: builder => builder.AddContent(0, "Auth pending..."),
authorizedContent: context => builder => builder.AddContent(0, $"Hello, {context.User.Identity.Name}!")); authorized: context => builder => builder.AddContent(0, $"Hello, {context.User.Identity.Name}!"));
var authTcs = new TaskCompletionSource<AuthenticationState>(); var authTcs = new TaskCompletionSource<AuthenticationState>();
rootComponent.AuthenticationState = authTcs.Task; rootComponent.AuthenticationState = authTcs.Task;
@ -447,9 +447,9 @@ namespace Microsoft.AspNetCore.Components
private static TestAuthStateProviderComponent WrapInAuthorizeView( private static TestAuthStateProviderComponent WrapInAuthorizeView(
RenderFragment<AuthenticationState> childContent = null, RenderFragment<AuthenticationState> childContent = null,
RenderFragment<AuthenticationState> authorizedContent = null, RenderFragment<AuthenticationState> authorized = null,
RenderFragment<AuthenticationState> notAuthorizedContent = null, RenderFragment<AuthenticationState> notAuthorized = null,
RenderFragment authorizingContent = null, RenderFragment authorizing = null,
string policy = null, string policy = null,
string roles = null, string roles = null,
object resource = null) object resource = null)
@ -458,9 +458,9 @@ namespace Microsoft.AspNetCore.Components
{ {
builder.OpenComponent<AuthorizeView>(0); builder.OpenComponent<AuthorizeView>(0);
builder.AddAttribute(1, nameof(AuthorizeView.ChildContent), childContent); builder.AddAttribute(1, nameof(AuthorizeView.ChildContent), childContent);
builder.AddAttribute(2, nameof(AuthorizeView.Authorized), authorizedContent); builder.AddAttribute(2, nameof(AuthorizeView.Authorized), authorized);
builder.AddAttribute(3, nameof(AuthorizeView.NotAuthorized), notAuthorizedContent); builder.AddAttribute(3, nameof(AuthorizeView.NotAuthorized), notAuthorized);
builder.AddAttribute(4, nameof(AuthorizeView.Authorizing), authorizingContent); builder.AddAttribute(4, nameof(AuthorizeView.Authorizing), authorizing);
builder.AddAttribute(5, nameof(AuthorizeView.Policy), policy); builder.AddAttribute(5, nameof(AuthorizeView.Policy), policy);
builder.AddAttribute(6, nameof(AuthorizeView.Roles), roles); builder.AddAttribute(6, nameof(AuthorizeView.Roles), roles);
builder.AddAttribute(7, nameof(AuthorizeView.Resource), resource); builder.AddAttribute(7, nameof(AuthorizeView.Resource), resource);

View File

@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Components
var binder = EventCallback.Factory.CreateBinder(component, setter, value); var binder = EventCallback.Factory.CreateBinder(component, setter, value);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "not-an-integer!", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "not-an-integer!", });
Assert.Equal(17, value); // Setter not called Assert.Equal(17, value); // Setter not called
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -40,7 +40,7 @@ namespace Microsoft.AspNetCore.Components
var binder = EventCallback.Factory.CreateBinder(component, setter, value); var binder = EventCallback.Factory.CreateBinder(component, setter, value);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = string.Empty, }); await binder.InvokeAsync(new ChangeEventArgs() { Value = string.Empty, });
Assert.Equal(0, value); // Calls setter to apply default value for this type Assert.Equal(0, value); // Calls setter to apply default value for this type
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -58,7 +58,7 @@ namespace Microsoft.AspNetCore.Components
// Act // Act
await Assert.ThrowsAsync<InvalidTimeZoneException>(() => await Assert.ThrowsAsync<InvalidTimeZoneException>(() =>
{ {
return binder.InvokeAsync(new UIChangeEventArgs() { Value = "18", }); return binder.InvokeAsync(new ChangeEventArgs() { Value = "18", });
}); });
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -75,7 +75,7 @@ namespace Microsoft.AspNetCore.Components
var binder = EventCallback.Factory.CreateBinder(component, setter, value); var binder = EventCallback.Factory.CreateBinder(component, setter, value);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "not-an-integer!", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "not-an-integer!", });
Assert.Equal(17, value); // Setter not called Assert.Equal(17, value); // Setter not called
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -92,7 +92,7 @@ namespace Microsoft.AspNetCore.Components
var binder = EventCallback.Factory.CreateBinder(component, setter, value); var binder = EventCallback.Factory.CreateBinder(component, setter, value);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "", });
Assert.Null(value); // Setter called Assert.Null(value); // Setter called
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -111,7 +111,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = "bye"; var expectedValue = "bye";
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue, }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue, });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -130,7 +130,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = true; var expectedValue = true;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = true, }); await binder.InvokeAsync(new ChangeEventArgs() { Value = true, });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -149,7 +149,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (bool?)true; var expectedValue = (bool?)true;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = true, }); await binder.InvokeAsync(new ChangeEventArgs() { Value = true, });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -168,7 +168,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = 42; var expectedValue = 42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -187,7 +187,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (int?)42; var expectedValue = (int?)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -206,7 +206,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (long)42; var expectedValue = (long)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -225,7 +225,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (long?)42; var expectedValue = (long?)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -244,7 +244,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (float)42; var expectedValue = (float)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -263,7 +263,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (float?)42; var expectedValue = (float?)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -282,7 +282,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (double)42; var expectedValue = (double)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -301,7 +301,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (double?)42; var expectedValue = (double?)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -320,7 +320,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (decimal)42; var expectedValue = (decimal)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -339,7 +339,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = (decimal?)42; var expectedValue = (decimal?)42;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -358,7 +358,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = AttributeTargets.Class; var expectedValue = AttributeTargets.Class;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -377,7 +377,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = AttributeTargets.Class; var expectedValue = AttributeTargets.Class;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -396,7 +396,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3); var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -415,7 +415,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3); var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -435,7 +435,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4); var expectedValue = new DateTime(2018, 3, 4);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(format), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(format), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -455,7 +455,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4); var expectedValue = new DateTime(2018, 3, 4);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(format), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(format), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -474,7 +474,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3); var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -493,7 +493,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3); var expectedValue = new DateTime(2018, 3, 4, 1, 2, 3);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -513,7 +513,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4); var expectedValue = new DateTime(2018, 3, 4);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(format), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(format), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -533,7 +533,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new DateTime(2018, 3, 4); var expectedValue = new DateTime(2018, 3, 4);
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(format), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(format), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -553,7 +553,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = Guid.NewGuid(); var expectedValue = Guid.NewGuid();
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -573,7 +573,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = Guid.NewGuid(); var expectedValue = Guid.NewGuid();
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -592,7 +592,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = new SecretMessage() { Message = "TypeConverter may be old, but it still works!", }; var expectedValue = new SecretMessage() { Message = "TypeConverter may be old, but it still works!", };
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = expectedValue.ToString(), }); await binder.InvokeAsync(new ChangeEventArgs() { Value = expectedValue.ToString(), });
Assert.Equal(expectedValue.Message, value.Message); Assert.Equal(expectedValue.Message, value.Message);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -627,7 +627,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = 42_000; var expectedValue = 42_000;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42 000,00", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42 000,00", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);
@ -646,7 +646,7 @@ namespace Microsoft.AspNetCore.Components
var expectedValue = 42_000; var expectedValue = 42_000;
// Act // Act
await binder.InvokeAsync(new UIChangeEventArgs() { Value = "42,000.00", }); await binder.InvokeAsync(new ChangeEventArgs() { Value = "42,000.00", });
Assert.Equal(expectedValue, value); Assert.Equal(expectedValue, value);
Assert.Equal(1, component.Count); Assert.Equal(1, component.Count);

View File

@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Components
public async Task EventCallbackOfT_Default() public async Task EventCallbackOfT_Default()
{ {
// Arrange // Arrange
var callback = default(EventCallback<UIEventArgs>); var callback = default(EventCallback<EventArgs>);
// Act & Assert (Does not throw) // Act & Assert (Does not throw)
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Components
{ {
// Arrange // Arrange
int runCount = 0; int runCount = 0;
var callback = new EventCallback<UIEventArgs>(null, (Action)(() => runCount++)); var callback = new EventCallback<EventArgs>(null, (Action)(() => runCount++));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -89,7 +89,7 @@ namespace Microsoft.AspNetCore.Components
var callback = new EventCallback(component, (Action)(() => runCount++)); var callback = new EventCallback(component, (Action)(() => runCount++));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -104,8 +104,8 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback(component, (Action<UIEventArgs>)((e) => { arg = e; runCount++; })); var callback = new EventCallback(component, (Action<EventArgs>)((e) => { arg = e; runCount++; }));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -124,11 +124,11 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback(component, (Action<UIEventArgs>)((e) => { arg = e; runCount++; })); var callback = new EventCallback(component, (Action<EventArgs>)((e) => { arg = e; runCount++; }));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -164,8 +164,8 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback(component, (Action<UIEventArgs>)((e) => { arg = e; runCount++; })); var callback = new EventCallback(component, (Action<EventArgs>)((e) => { arg = e; runCount++; }));
// Act & Assert // Act & Assert
await Assert.ThrowsAsync<ArgumentException>(() => await Assert.ThrowsAsync<ArgumentException>(() =>
@ -202,7 +202,7 @@ namespace Microsoft.AspNetCore.Components
var callback = new EventCallback(component, (Func<Task>)(() => { runCount++; return Task.CompletedTask; })); var callback = new EventCallback(component, (Func<Task>)(() => { runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -217,8 +217,8 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback(component, (Func<UIEventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; })); var callback = new EventCallback(component, (Func<EventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -237,11 +237,11 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback(component, (Func<UIEventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; })); var callback = new EventCallback(component, (Func<EventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -277,8 +277,8 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback(component, (Func<UIEventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; })); var callback = new EventCallback(component, (Func<EventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; }));
// Act & Assert // Act & Assert
await Assert.ThrowsAsync<ArgumentException>(() => await Assert.ThrowsAsync<ArgumentException>(() =>
@ -294,7 +294,7 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
var callback = new EventCallback<UIEventArgs>(component, (Action)(() => runCount++)); var callback = new EventCallback<EventArgs>(component, (Action)(() => runCount++));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -312,10 +312,10 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
var callback = new EventCallback<UIEventArgs>(component, (Action)(() => runCount++)); var callback = new EventCallback<EventArgs>(component, (Action)(() => runCount++));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -330,8 +330,8 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback<UIEventArgs>(component, (Action<UIEventArgs>)((e) => { arg = e; runCount++; })); var callback = new EventCallback<EventArgs>(component, (Action<EventArgs>)((e) => { arg = e; runCount++; }));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -350,11 +350,11 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback<UIEventArgs>(component, (Action<UIEventArgs>)((e) => { arg = e; runCount++; })); var callback = new EventCallback<EventArgs>(component, (Action<EventArgs>)((e) => { arg = e; runCount++; }));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -370,7 +370,7 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
var callback = new EventCallback<UIEventArgs>(component, (Func<Task>)(() => { runCount++; return Task.CompletedTask; })); var callback = new EventCallback<EventArgs>(component, (Func<Task>)(() => { runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -388,10 +388,10 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
var callback = new EventCallback<UIEventArgs>(component, (Func<Task>)(() => { runCount++; return Task.CompletedTask; })); var callback = new EventCallback<EventArgs>(component, (Func<Task>)(() => { runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert
@ -406,8 +406,8 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback<UIEventArgs>(component, (Func<UIEventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; })); var callback = new EventCallback<EventArgs>(component, (Func<EventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(null); await callback.InvokeAsync(null);
@ -426,11 +426,11 @@ namespace Microsoft.AspNetCore.Components
var component = new EventCountingComponent(); var component = new EventCountingComponent();
int runCount = 0; int runCount = 0;
UIEventArgs arg = null; EventArgs arg = null;
var callback = new EventCallback<UIEventArgs>(component, (Func<UIEventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; })); var callback = new EventCallback<EventArgs>(component, (Func<EventArgs, Task>)((e) => { arg = e; runCount++; return Task.CompletedTask; }));
// Act // Act
await callback.InvokeAsync(new UIEventArgs()); await callback.InvokeAsync(new EventArgs());
// Assert // Assert

View File

@ -42,7 +42,7 @@ namespace Microsoft.AspNetCore.Components.Forms
} }
[Fact] [Fact]
public void CanAddMessagesByRange() public void CanAddMessagesMultiple()
{ {
// Arrange // Arrange
var messages = new ValidationMessageStore(new EditContext(new object())); var messages = new ValidationMessageStore(new EditContext(new object()));
@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Components.Forms
var entries = new[] { "A", "B", "C" }; var entries = new[] { "A", "B", "C" };
// Act // Act
messages.AddRange(field1, entries); messages.Add(field1, entries);
// Assert // Assert
Assert.Equal(entries, messages[field1]); Assert.Equal(entries, messages[field1]);

View File

@ -0,0 +1,117 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Xunit;
namespace Microsoft.AspNetCore.Components
{
public class NavigationManagerTest
{
[Theory]
[InlineData("scheme://host/", "scheme://host/")]
[InlineData("scheme://host:123/", "scheme://host:123/")]
[InlineData("scheme://host/path", "scheme://host/")]
[InlineData("scheme://host/path/", "scheme://host/path/")]
[InlineData("scheme://host/path/page?query=string&another=here", "scheme://host/path/")]
public void ComputesCorrectBaseUri(string baseUri, string expectedResult)
{
var actualResult = NavigationManager.NormalizeBaseUri(baseUri);
Assert.Equal(expectedResult, actualResult);
}
[Theory]
[InlineData("scheme://host/", "scheme://host", "")]
[InlineData("scheme://host/", "scheme://host/", "")]
[InlineData("scheme://host/", "scheme://host/path", "path")]
[InlineData("scheme://host/path/", "scheme://host/path/", "")]
[InlineData("scheme://host/path/", "scheme://host/path/more", "more")]
[InlineData("scheme://host/path/", "scheme://host/path", "")]
[InlineData("scheme://host/path/", "scheme://host/path#hash", "#hash")]
[InlineData("scheme://host/path/", "scheme://host/path/#hash", "#hash")]
[InlineData("scheme://host/path/", "scheme://host/path/more#hash", "more#hash")]
public void ComputesCorrectValidBaseRelativePaths(string baseUri, string uri, string expectedResult)
{
var navigationManager = new TestNavigationManager(baseUri);
var actualResult = navigationManager.ToBaseRelativePath(uri);
Assert.Equal(expectedResult, actualResult);
}
[Theory]
[InlineData("scheme://host/", "otherscheme://host/")]
[InlineData("scheme://host/", "scheme://otherhost/")]
[InlineData("scheme://host/path/", "scheme://host/")]
public void Initialize_ThrowsForInvalidBaseRelativePaths(string baseUri, string absoluteUri)
{
var navigationManager = new TestNavigationManager();
var ex = Assert.Throws<ArgumentException>(() =>
{
navigationManager.Initialize(baseUri, absoluteUri);
});
Assert.Equal(
$"The URI '{absoluteUri}' is not contained by the base URI '{baseUri}'.",
ex.Message);
}
[Theory]
[InlineData("scheme://host/", "otherscheme://host/")]
[InlineData("scheme://host/", "scheme://otherhost/")]
[InlineData("scheme://host/path/", "scheme://host/")]
public void Uri_ThrowsForInvalidBaseRelativePaths(string baseUri, string absoluteUri)
{
var navigationManager = new TestNavigationManager(baseUri);
var ex = Assert.Throws<ArgumentException>(() =>
{
navigationManager.ToBaseRelativePath(absoluteUri);
});
Assert.Equal(
$"The URI '{absoluteUri}' is not contained by the base URI '{baseUri}'.",
ex.Message);
}
[Theory]
[InlineData("scheme://host/", "otherscheme://host/")]
[InlineData("scheme://host/", "scheme://otherhost/")]
[InlineData("scheme://host/path/", "scheme://host/")]
public void ToBaseRelativePath_ThrowsForInvalidBaseRelativePaths(string baseUri, string absoluteUri)
{
var navigationManager = new TestNavigationManager(baseUri);
var ex = Assert.Throws<ArgumentException>(() =>
{
navigationManager.ToBaseRelativePath(absoluteUri);
});
Assert.Equal(
$"The URI '{absoluteUri}' is not contained by the base URI '{baseUri}'.",
ex.Message);
}
private class TestNavigationManager : NavigationManager
{
public TestNavigationManager()
{
}
public TestNavigationManager(string baseUri = null, string uri = null)
{
Initialize(baseUri ?? "http://example.com/", uri ?? baseUri ?? "http://example.com/welcome-page");
}
public new void Initialize(string baseUri, string uri)
{
base.Initialize(baseUri, uri);
}
protected override void NavigateToCore(string uri, bool forceLoad)
{
throw new System.NotImplementedException();
}
}
}
}

View File

@ -0,0 +1,61 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Dynamic;
using System.Linq;
using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.AspNetCore.Components.Test.Helpers;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
namespace Microsoft.AspNetCore.Components
{
public class OwningComponentBaseTest
{
[Fact]
public void CreatesScopeAndService()
{
var services = new ServiceCollection();
services.AddSingleton<Counter>();
services.AddTransient<MyService>();
var serviceProvider = services.BuildServiceProvider();
var counter = serviceProvider.GetRequiredService<Counter>();
var renderer = new TestRenderer(serviceProvider);
var component1 = renderer.InstantiateComponent<MyOwningComponent>();
Assert.NotNull(component1.MyService);
Assert.Equal(1, counter.CreatedCount);
Assert.Equal(0, counter.DisposedCount);
((IDisposable)component1).Dispose();
Assert.Equal(1, counter.CreatedCount);
Assert.Equal(1, counter.DisposedCount);
}
private class Counter
{
public int CreatedCount { get; set; }
public int DisposedCount { get; set; }
}
private class MyService : IDisposable
{
public MyService(Counter counter)
{
Counter = counter;
Counter.CreatedCount++;
}
public Counter Counter { get; }
void IDisposable.Dispose() => Counter.DisposedCount++;
}
private class MyOwningComponent : OwningComponentBase<MyService>
{
public MyService MyService => Service;
}
}
}

View File

@ -216,7 +216,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
// Arrange // Arrange
var builder = new RenderTreeBuilder(); var builder = new RenderTreeBuilder();
Action<UIEventArgs> eventHandler = eventInfo => { }; Action<EventArgs> eventHandler = eventInfo => { };
// Act // Act
builder.OpenElement(0, "myelement"); // 0: <myelement builder.OpenElement(0, "myelement"); // 0: <myelement
@ -261,7 +261,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
// Arrange // Arrange
var builder = new RenderTreeBuilder(); var builder = new RenderTreeBuilder();
Action<UIEventArgs> eventHandler = eventInfo => { }; Action<EventArgs> eventHandler = eventInfo => { };
// Act // Act
builder.OpenElement(0, "myelement"); builder.OpenElement(0, "myelement");
@ -428,7 +428,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
builder.OpenElement(0, "some element"); builder.OpenElement(0, "some element");
builder.AddContent(1, "hello"); builder.AddContent(1, "hello");
builder.AddAttribute(2, "name", new Action<UIEventArgs>(eventInfo => { })); builder.AddAttribute(2, "name", new Action<EventArgs>(eventInfo => { }));
}); });
} }
@ -897,7 +897,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var builder = new RenderTreeBuilder(); var builder = new RenderTreeBuilder();
var value = new Action<UIEventArgs>((e) => { }); var value = new Action<EventArgs>((e) => { });
// Act // Act
builder.OpenElement(0, "elem"); builder.OpenElement(0, "elem");
@ -919,7 +919,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Act // Act
builder.OpenElement(0, "elem"); builder.OpenElement(0, "elem");
builder.AddAttribute(1, "attr", (Action<UIEventArgs>)null); builder.AddAttribute(1, "attr", (Action<EventArgs>)null);
builder.CloseElement(); builder.CloseElement();
// Assert // Assert
@ -965,7 +965,7 @@ namespace Microsoft.AspNetCore.Components.Test
frame => AssertFrame.Element(frame, "elem", 1, 0)); frame => AssertFrame.Element(frame, "elem", 1, 0));
} }
public static TheoryData<Action<UIEventArgs>> EventHandlerValues => new TheoryData<Action<UIEventArgs>> public static TheoryData<Action<EventArgs>> EventHandlerValues => new TheoryData<Action<EventArgs>>
{ {
null, null,
(e) => { }, (e) => { },
@ -973,7 +973,7 @@ namespace Microsoft.AspNetCore.Components.Test
[Theory] [Theory]
[MemberData(nameof(EventHandlerValues))] [MemberData(nameof(EventHandlerValues))]
public void AddAttribute_Component_EventHandlerValue_SetsAttributeValue(Action<UIEventArgs> value) public void AddAttribute_Component_EventHandlerValue_SetsAttributeValue(Action<EventArgs> value)
{ {
// Arrange // Arrange
var builder = new RenderTreeBuilder(); var builder = new RenderTreeBuilder();
@ -1241,7 +1241,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var builder = new RenderTreeBuilder(); var builder = new RenderTreeBuilder();
var value = new Action<UIEventArgs>((e) => { }); var value = new Action<EventArgs>((e) => { });
// Act // Act
builder.OpenElement(0, "elem"); builder.OpenElement(0, "elem");
@ -1261,7 +1261,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var builder = new RenderTreeBuilder(); var builder = new RenderTreeBuilder();
var value = new Action<UIEventArgs>((e) => { }); var value = new Action<EventArgs>((e) => { });
// Act // Act
builder.OpenComponent<TestComponent>(0); builder.OpenComponent<TestComponent>(0);

View File

@ -360,6 +360,23 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Equal("More than one sibling has the same key value, 'key1'. Key values must be unique.", ex.Message); Assert.Equal("More than one sibling has the same key value, 'key1'. Key values must be unique.", ex.Message);
} }
[Fact]
public void RejectsClashingKeysEvenIfAllPairsMatch()
{
// This sort of scenario would happen if you accidentally used a constant value for @key
// Arrange
AddWithKey(oldTree, "key1", "attrib1a");
AddWithKey(oldTree, "key1", "attrib1b");
AddWithKey(newTree, "key1", "attrib1a");
AddWithKey(newTree, "key1", "attrib1b");
// Act/Assert
var ex = Assert.Throws<InvalidOperationException>(() => GetSingleUpdatedComponent());
Assert.Equal("More than one sibling has the same key value, 'key1'. Key values must be unique.", ex.Message);
}
[Fact] [Fact]
public void HandlesInsertionOfUnkeyedItemsAroundKey() public void HandlesInsertionOfUnkeyedItemsAroundKey()
{ {
@ -835,9 +852,9 @@ namespace Microsoft.AspNetCore.Components.Test
public void RecognizesAttributeEventHandlerValuesChanged() public void RecognizesAttributeEventHandlerValuesChanged()
{ {
// Arrange // Arrange
Action<UIEventArgs> retainedHandler = _ => { }; Action<EventArgs> retainedHandler = _ => { };
Action<UIEventArgs> removedHandler = _ => { }; Action<EventArgs> removedHandler = _ => { };
Action<UIEventArgs> addedHandler = _ => { }; Action<EventArgs> addedHandler = _ => { };
oldTree.OpenElement(0, "My element"); oldTree.OpenElement(0, "My element");
oldTree.AddAttribute(1, "onfoo", retainedHandler); oldTree.AddAttribute(1, "onfoo", retainedHandler);
oldTree.AddAttribute(2, "onbar", removedHandler); oldTree.AddAttribute(2, "onbar", removedHandler);
@ -1575,7 +1592,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void PreservesEventHandlerIdsForRetainedEventHandlers() public void PreservesEventHandlerIdsForRetainedEventHandlers()
{ {
// Arrange // Arrange
Action<UIEventArgs> retainedHandler = _ => { }; Action<EventArgs> retainedHandler = _ => { };
oldTree.OpenElement(0, "My element"); oldTree.OpenElement(0, "My element");
oldTree.AddAttribute(1, "ontest", retainedHandler); oldTree.AddAttribute(1, "ontest", retainedHandler);
oldTree.CloseElement(); oldTree.CloseElement();
@ -1601,7 +1618,7 @@ namespace Microsoft.AspNetCore.Components.Test
public void PreservesEventHandlerIdsForRetainedEventHandlers_SlowPath() public void PreservesEventHandlerIdsForRetainedEventHandlers_SlowPath()
{ {
// Arrange // Arrange
Action<UIEventArgs> retainedHandler = _ => { }; Action<EventArgs> retainedHandler = _ => { };
oldTree.OpenElement(0, "My element"); oldTree.OpenElement(0, "My element");
oldTree.AddAttribute(0, "ontest", retainedHandler); oldTree.AddAttribute(0, "ontest", retainedHandler);
oldTree.CloseElement(); oldTree.CloseElement();

View File

@ -430,7 +430,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
// Arrange: Render a component with an event handler // Arrange: Render a component with an event handler
var renderer = new TestRenderer(); var renderer = new TestRenderer();
UIEventArgs receivedArgs = null; EventArgs receivedArgs = null;
var component = new EventComponent var component = new EventComponent
{ {
@ -448,7 +448,7 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Null(receivedArgs); Assert.Null(receivedArgs);
// Act/Assert: Event can be fired // Act/Assert: Event can be fired
var eventArgs = new UIEventArgs(); var eventArgs = new EventArgs();
var task = renderer.DispatchEventAsync(eventHandlerId, eventArgs); var task = renderer.DispatchEventAsync(eventHandlerId, eventArgs);
// This should always be run synchronously // This should always be run synchronously
@ -460,7 +460,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
// Arrange: Render a component with an event handler // Arrange: Render a component with an event handler
var renderer = new TestRenderer(); var renderer = new TestRenderer();
UIEventArgs receivedArgs = null; EventArgs receivedArgs = null;
var component = new EventComponent var component = new EventComponent
{ {
@ -478,7 +478,7 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Null(receivedArgs); Assert.Null(receivedArgs);
// Act/Assert: Event can be fired // Act/Assert: Event can be fired
var eventArgs = new UIEventArgs(); var eventArgs = new EventArgs();
var renderTask = renderer.DispatchEventAsync(eventHandlerId, eventArgs); var renderTask = renderer.DispatchEventAsync(eventHandlerId, eventArgs);
Assert.True(renderTask.IsCompletedSuccessfully); Assert.True(renderTask.IsCompletedSuccessfully);
Assert.Same(eventArgs, receivedArgs); Assert.Same(eventArgs, receivedArgs);
@ -508,7 +508,7 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Empty(renderer.HandledExceptions); Assert.Empty(renderer.HandledExceptions);
// Act/Assert: Event can be fired // Act/Assert: Event can be fired
var eventArgs = new UIEventArgs(); var eventArgs = new EventArgs();
var renderTask = renderer.DispatchEventAsync(eventHandlerId, eventArgs); var renderTask = renderer.DispatchEventAsync(eventHandlerId, eventArgs);
Assert.True(renderTask.IsCompletedSuccessfully); Assert.True(renderTask.IsCompletedSuccessfully);
@ -577,7 +577,7 @@ namespace Microsoft.AspNetCore.Components.Test
[Fact] [Fact]
public void CanDispatchEventsToNestedComponents() public void CanDispatchEventsToNestedComponents()
{ {
UIEventArgs receivedArgs = null; EventArgs receivedArgs = null;
// Arrange: Render parent component // Arrange: Render parent component
var renderer = new TestRenderer(); var renderer = new TestRenderer();
@ -608,7 +608,7 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Null(receivedArgs); Assert.Null(receivedArgs);
// Act/Assert: Event can be fired // Act/Assert: Event can be fired
var eventArgs = new UIEventArgs(); var eventArgs = new EventArgs();
var renderTask = renderer.DispatchEventAsync(eventHandlerId, eventArgs); var renderTask = renderer.DispatchEventAsync(eventHandlerId, eventArgs);
Assert.True(renderTask.IsCompletedSuccessfully); Assert.True(renderTask.IsCompletedSuccessfully);
Assert.Same(eventArgs, receivedArgs); Assert.Same(eventArgs, receivedArgs);
@ -619,7 +619,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
// Arrange: Render a component with an event handler // Arrange: Render a component with an event handler
var renderer = new TestRenderer(); var renderer = new TestRenderer();
UIEventArgs receivedArgs = null; EventArgs receivedArgs = null;
var state = 0; var state = 0;
var tcs = new TaskCompletionSource<object>(); var tcs = new TaskCompletionSource<object>();
@ -646,7 +646,7 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Null(receivedArgs); Assert.Null(receivedArgs);
// Act/Assert: Event can be fired // Act/Assert: Event can be fired
var eventArgs = new UIEventArgs(); var eventArgs = new EventArgs();
var task = renderer.DispatchEventAsync(eventHandlerId, eventArgs); var task = renderer.DispatchEventAsync(eventHandlerId, eventArgs);
Assert.Equal(1, state); Assert.Equal(1, state);
Assert.Same(eventArgs, receivedArgs); Assert.Same(eventArgs, receivedArgs);
@ -746,7 +746,7 @@ namespace Microsoft.AspNetCore.Components.Test
[Fact] [Fact]
public async Task CanAsyncDispatchEventsToNestedComponents() public async Task CanAsyncDispatchEventsToNestedComponents()
{ {
UIEventArgs receivedArgs = null; EventArgs receivedArgs = null;
var state = 0; var state = 0;
var tcs = new TaskCompletionSource<object>(); var tcs = new TaskCompletionSource<object>();
@ -786,7 +786,7 @@ namespace Microsoft.AspNetCore.Components.Test
Assert.Null(receivedArgs); Assert.Null(receivedArgs);
// Act/Assert: Event can be fired // Act/Assert: Event can be fired
var eventArgs = new UIEventArgs(); var eventArgs = new EventArgs();
var task = renderer.DispatchEventAsync(eventHandlerId, eventArgs); var task = renderer.DispatchEventAsync(eventHandlerId, eventArgs);
Assert.Equal(1, state); Assert.Equal(1, state);
Assert.Same(eventArgs, receivedArgs); Assert.Same(eventArgs, receivedArgs);
@ -1774,7 +1774,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Act/Assert // Act/Assert
await Assert.ThrowsAsync<ArgumentException>(() => await Assert.ThrowsAsync<ArgumentException>(() =>
{ {
return renderer.DispatchEventAsync(0, new UIEventArgs()); return renderer.DispatchEventAsync(0, new EventArgs());
}); });
} }
@ -2052,7 +2052,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var renderer = new TestRenderer(); var renderer = new TestRenderer();
var eventCount = 0; var eventCount = 0;
Action<UIEventArgs> origEventHandler = args => { eventCount++; }; Action<EventArgs> origEventHandler = args => { eventCount++; };
var component = new EventComponent { OnTest = origEventHandler }; var component = new EventComponent { OnTest = origEventHandler };
var componentId = renderer.AssignRootComponentId(component); var componentId = renderer.AssignRootComponentId(component);
component.TriggerRender(); component.TriggerRender();
@ -2094,7 +2094,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var renderer = new TestRenderer(); var renderer = new TestRenderer();
var eventCount = 0; var eventCount = 0;
Action<UIEventArgs> origEventHandler = args => { eventCount++; }; Action<EventArgs> origEventHandler = args => { eventCount++; };
var component = new EventComponent { OnTest = origEventHandler }; var component = new EventComponent { OnTest = origEventHandler };
var componentId = renderer.AssignRootComponentId(component); var componentId = renderer.AssignRootComponentId(component);
component.TriggerRender(); component.TriggerRender();
@ -2129,7 +2129,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var renderer = new TestRenderer(); var renderer = new TestRenderer();
var eventCount = 0; var eventCount = 0;
Action<UIEventArgs> origEventHandler = args => { eventCount++; }; Action<EventArgs> origEventHandler = args => { eventCount++; };
var component = new ConditionalParentComponent<EventComponent> var component = new ConditionalParentComponent<EventComponent>
{ {
IncludeChild = true, IncludeChild = true,
@ -2180,7 +2180,7 @@ namespace Microsoft.AspNetCore.Components.Test
// Arrange // Arrange
var renderer = new TestRenderer(); var renderer = new TestRenderer();
var eventCount = 0; var eventCount = 0;
Action<UIEventArgs> origEventHandler = args => { eventCount++; }; Action<EventArgs> origEventHandler = args => { eventCount++; };
var component = new EventComponent { OnTest = origEventHandler }; var component = new EventComponent { OnTest = origEventHandler };
var componentId = renderer.AssignRootComponentId(component); var componentId = renderer.AssignRootComponentId(component);
component.TriggerRender(); component.TriggerRender();
@ -2222,7 +2222,7 @@ namespace Microsoft.AspNetCore.Components.Test
{ {
builder.AddContent(0, "Child event count: " + eventCount); builder.AddContent(0, "Child event count: " + eventCount);
builder.OpenComponent<EventComponent>(1); builder.OpenComponent<EventComponent>(1);
builder.AddAttribute(2, nameof(EventComponent.OnTest), new Action<UIEventArgs>(args => builder.AddAttribute(2, nameof(EventComponent.OnTest), new Action<EventArgs>(args =>
{ {
eventCount++; eventCount++;
rootComponent.TriggerRender(); rootComponent.TriggerRender();
@ -2468,7 +2468,7 @@ namespace Microsoft.AspNetCore.Components.Test
.AttributeEventHandlerId; .AttributeEventHandlerId;
// Act: Toggle the checkbox // Act: Toggle the checkbox
var eventArgs = new UIChangeEventArgs { Value = true }; var eventArgs = new ChangeEventArgs { Value = true };
var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs); var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs);
Assert.True(renderTask.IsCompletedSuccessfully); Assert.True(renderTask.IsCompletedSuccessfully);
@ -2713,7 +2713,7 @@ namespace Microsoft.AspNetCore.Components.Test
}; };
var numEventsFired = 0; var numEventsFired = 0;
EventComponent component = null; EventComponent component = null;
Action<UIEventArgs> eventHandler = null; Action<EventArgs> eventHandler = null;
eventHandler = _ => eventHandler = _ =>
{ {
@ -2737,14 +2737,14 @@ namespace Microsoft.AspNetCore.Components.Test
// Act/Assert 1: Event can be fired for the first time // Act/Assert 1: Event can be fired for the first time
var render1TCS = new TaskCompletionSource<object>(); var render1TCS = new TaskCompletionSource<object>();
renderer.NextUpdateDisplayReturnTask = render1TCS.Task; renderer.NextUpdateDisplayReturnTask = render1TCS.Task;
await renderer.DispatchEventAsync(eventHandlerId, new UIEventArgs()); await renderer.DispatchEventAsync(eventHandlerId, new EventArgs());
Assert.Equal(1, numEventsFired); Assert.Equal(1, numEventsFired);
// Act/Assert 2: *Same* event handler ID can be reused prior to completion of // Act/Assert 2: *Same* event handler ID can be reused prior to completion of
// preceding UI update // preceding UI update
var render2TCS = new TaskCompletionSource<object>(); var render2TCS = new TaskCompletionSource<object>();
renderer.NextUpdateDisplayReturnTask = render2TCS.Task; renderer.NextUpdateDisplayReturnTask = render2TCS.Task;
await renderer.DispatchEventAsync(eventHandlerId, new UIEventArgs()); await renderer.DispatchEventAsync(eventHandlerId, new EventArgs());
Assert.Equal(2, numEventsFired); Assert.Equal(2, numEventsFired);
// Act/Assert 3: After we complete the first UI update in which a given // Act/Assert 3: After we complete the first UI update in which a given
@ -2760,7 +2760,7 @@ namespace Microsoft.AspNetCore.Components.Test
await awaitableTask; await awaitableTask;
var ex = await Assert.ThrowsAsync<ArgumentException>(() => var ex = await Assert.ThrowsAsync<ArgumentException>(() =>
{ {
return renderer.DispatchEventAsync(eventHandlerId, new UIEventArgs()); return renderer.DispatchEventAsync(eventHandlerId, new EventArgs());
}); });
Assert.Equal($"There is no event handler with ID {eventHandlerId}", ex.Message); Assert.Equal($"There is no event handler with ID {eventHandlerId}", ex.Message);
Assert.Equal(2, numEventsFired); Assert.Equal(2, numEventsFired);
@ -3318,7 +3318,7 @@ namespace Microsoft.AspNetCore.Components.Test
FieldValue = "new property value", FieldValue = "new property value",
ComponentId = componentId ComponentId = componentId
}; };
var dispatchEventTask = renderer.DispatchEventAsync(eventHandlerId, eventFieldInfo, new UIChangeEventArgs var dispatchEventTask = renderer.DispatchEventAsync(eventHandlerId, eventFieldInfo, new ChangeEventArgs
{ {
Value = "new property value" Value = "new property value"
}); });
@ -3336,7 +3336,7 @@ namespace Microsoft.AspNetCore.Components.Test
// show that the diff does *not* update the BoundString value attribute. // show that the diff does *not* update the BoundString value attribute.
Assert.Equal(RenderTreeEditType.SetAttribute, edit.Type); Assert.Equal(RenderTreeEditType.SetAttribute, edit.Type);
var attributeFrame = batch2.ReferenceFrames[edit.ReferenceFrameIndex]; var attributeFrame = batch2.ReferenceFrames[edit.ReferenceFrameIndex];
AssertFrame.Attribute(attributeFrame, "ontestevent", typeof(Action<UIChangeEventArgs>)); AssertFrame.Attribute(attributeFrame, "ontestevent", typeof(Action<ChangeEventArgs>));
Assert.NotEqual(default, attributeFrame.AttributeEventHandlerId); Assert.NotEqual(default, attributeFrame.AttributeEventHandlerId);
Assert.NotEqual(eventHandlerId, attributeFrame.AttributeEventHandlerId); Assert.NotEqual(eventHandlerId, attributeFrame.AttributeEventHandlerId);
}); });
@ -3370,7 +3370,7 @@ namespace Microsoft.AspNetCore.Components.Test
ComponentId = componentId, ComponentId = componentId,
FieldValue = newPropertyValue, FieldValue = newPropertyValue,
}; };
var dispatchEventTask = renderer.DispatchEventAsync(eventHandlerId, fieldInfo, new UIChangeEventArgs var dispatchEventTask = renderer.DispatchEventAsync(eventHandlerId, fieldInfo, new ChangeEventArgs
{ {
Value = newPropertyValue Value = newPropertyValue
}); });
@ -3388,7 +3388,7 @@ namespace Microsoft.AspNetCore.Components.Test
// show that the diff does *not* update the BoundString value attribute. // show that the diff does *not* update the BoundString value attribute.
Assert.Equal(RenderTreeEditType.SetAttribute, edit.Type); Assert.Equal(RenderTreeEditType.SetAttribute, edit.Type);
var attributeFrame = latestBatch.ReferenceFrames[edit.ReferenceFrameIndex]; var attributeFrame = latestBatch.ReferenceFrames[edit.ReferenceFrameIndex];
AssertFrame.Attribute(attributeFrame, "ontestevent", typeof(Action<UIChangeEventArgs>)); AssertFrame.Attribute(attributeFrame, "ontestevent", typeof(Action<ChangeEventArgs>));
Assert.NotEqual(default, attributeFrame.AttributeEventHandlerId); Assert.NotEqual(default, attributeFrame.AttributeEventHandlerId);
Assert.NotEqual(eventHandlerId, attributeFrame.AttributeEventHandlerId); Assert.NotEqual(eventHandlerId, attributeFrame.AttributeEventHandlerId);
}); });
@ -3507,10 +3507,10 @@ namespace Microsoft.AspNetCore.Components.Test
private class EventComponent : AutoRenderComponent, IComponent, IHandleEvent private class EventComponent : AutoRenderComponent, IComponent, IHandleEvent
{ {
[Parameter] [Parameter]
public Action<UIEventArgs> OnTest { get; set; } public Action<EventArgs> OnTest { get; set; }
[Parameter] [Parameter]
public Func<UIEventArgs, Task> OnTestAsync { get; set; } public Func<EventArgs, Task> OnTestAsync { get; set; }
[Parameter] [Parameter]
public Action<DerivedEventArgs> OnClick { get; set; } public Action<DerivedEventArgs> OnClick { get; set; }
@ -3664,7 +3664,7 @@ namespace Microsoft.AspNetCore.Components.Test
=> _renderHandle.Render(builder => => _renderHandle.Render(builder =>
{ {
builder.OpenElement(0, "my button"); builder.OpenElement(0, "my button");
builder.AddAttribute(1, "my click handler", new Action<UIEventArgs>(eventArgs => OnClick(eventArgs))); builder.AddAttribute(1, "my click handler", new Action<EventArgs>(eventArgs => OnClick(eventArgs)));
builder.CloseElement(); builder.CloseElement();
}); });
} }
@ -4095,7 +4095,7 @@ namespace Microsoft.AspNetCore.Components.Test
builder.OpenElement(0, "element with event"); builder.OpenElement(0, "element with event");
builder.AddAttribute(1, nameof(BoundString), BoundString); builder.AddAttribute(1, nameof(BoundString), BoundString);
builder.AddAttribute(2, "ontestevent", new Action<UIChangeEventArgs>((UIChangeEventArgs eventArgs) => builder.AddAttribute(2, "ontestevent", new Action<ChangeEventArgs>((ChangeEventArgs eventArgs) =>
{ {
BoundString = (string)eventArgs.Value; BoundString = (string)eventArgs.Value;
TriggerRender(); TriggerRender();
@ -4106,7 +4106,7 @@ namespace Microsoft.AspNetCore.Components.Test
} }
} }
private class DerivedEventArgs : UIEventArgs private class DerivedEventArgs : EventArgs
{ {
} }
} }

View File

@ -343,7 +343,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
{ {
rtb.OpenElement(0, "p"); rtb.OpenElement(0, "p");
rtb.OpenElement(1, "input"); rtb.OpenElement(1, "input");
rtb.AddAttribute(2, "change", pc.GetValueOrDefault<Action<UIChangeEventArgs>>("update")); rtb.AddAttribute(2, "change", pc.GetValueOrDefault<Action<ChangeEventArgs>>("update"));
rtb.AddAttribute(3, "value", pc.GetValueOrDefault<int>("value")); rtb.AddAttribute(3, "value", pc.GetValueOrDefault<int>("value"));
rtb.CloseElement(); rtb.CloseElement();
rtb.CloseElement(); rtb.CloseElement();
@ -354,7 +354,7 @@ namespace Microsoft.AspNetCore.Components.Rendering
.BuildServiceProvider(); .BuildServiceProvider();
var htmlRenderer = GetHtmlRenderer(serviceProvider); var htmlRenderer = GetHtmlRenderer(serviceProvider);
Action<UIChangeEventArgs> change = (UIChangeEventArgs changeArgs) => throw new InvalidOperationException(); Action<ChangeEventArgs> change = (ChangeEventArgs changeArgs) => throw new InvalidOperationException();
// Act // Act
var result = GetResult(htmlRenderer.Dispatcher.InvokeAsync(() => htmlRenderer.RenderComponentAsync<ComponentWithParameters>( var result = GetResult(htmlRenderer.Dispatcher.InvokeAsync(() => htmlRenderer.RenderComponentAsync<ComponentWithParameters>(

View File

@ -7,11 +7,11 @@
<Compile Include="Microsoft.AspNetCore.Components.Server.netcoreapp3.0.cs" /> <Compile Include="Microsoft.AspNetCore.Components.Server.netcoreapp3.0.cs" />
<Reference Include="Microsoft.AspNetCore.Components.Web" /> <Reference Include="Microsoft.AspNetCore.Components.Web" />
<Reference Include="Microsoft.AspNetCore.DataProtection" /> <Reference Include="Microsoft.AspNetCore.DataProtection" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.AspNetCore.SignalR" /> <Reference Include="Microsoft.AspNetCore.SignalR" />
<Reference Include="Microsoft.AspNetCore.StaticFiles" /> <Reference Include="Microsoft.AspNetCore.StaticFiles" />
<Reference Include="Microsoft.Extensions.Caching.Memory" /> <Reference Include="Microsoft.Extensions.Caching.Memory" />
<Reference Include="Microsoft.Extensions.FileProviders.Composite" /> <Reference Include="Microsoft.Extensions.FileProviders.Composite" />
<Reference Include="Microsoft.Extensions.FileProviders.Embedded" /> <Reference Include="Microsoft.Extensions.FileProviders.Embedded" />
<Reference Include="Microsoft.Extensions.Logging" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -14,8 +14,6 @@ namespace Microsoft.AspNetCore.Builder
} }
public static partial class ComponentEndpointRouteBuilderExtensions public static partial class ComponentEndpointRouteBuilderExtensions
{ {
public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints) { throw null; }
public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Action<Microsoft.AspNetCore.Http.Connections.HttpConnectionDispatcherOptions> configureOptions) { throw null; }
public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Type type, string selector) { throw null; } public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Type type, string selector) { throw null; }
public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Type type, string selector, System.Action<Microsoft.AspNetCore.Http.Connections.HttpConnectionDispatcherOptions> configureOptions) { throw null; } public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Type type, string selector, System.Action<Microsoft.AspNetCore.Http.Connections.HttpConnectionDispatcherOptions> configureOptions) { throw null; }
public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Type componentType, string selector, string path) { throw null; } public static Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder MapBlazorHub(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, System.Type componentType, string selector, string path) { throw null; }
@ -36,22 +34,6 @@ namespace Microsoft.AspNetCore.Components.Server
public System.TimeSpan DisconnectedCircuitRetentionPeriod { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.TimeSpan DisconnectedCircuitRetentionPeriod { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public System.TimeSpan JSInteropDefaultCallTimeout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.TimeSpan JSInteropDefaultCallTimeout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class ComponentPrerenderingContext
{
public ComponentPrerenderingContext() { }
public System.Type ComponentType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Http.HttpContext Context { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Components.ParameterView Parameters { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
}
public sealed partial class ComponentPrerenderResult
{
internal ComponentPrerenderResult() { }
public void WriteTo(System.IO.TextWriter writer) { }
}
public partial interface IComponentPrerenderer
{
System.Threading.Tasks.Task<Microsoft.AspNetCore.Components.Server.ComponentPrerenderResult> PrerenderComponentAsync(Microsoft.AspNetCore.Components.Server.ComponentPrerenderingContext context);
}
} }
namespace Microsoft.AspNetCore.Components.Server.Circuits namespace Microsoft.AspNetCore.Components.Server.Circuits
{ {
@ -69,15 +51,6 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public virtual System.Threading.Tasks.Task OnConnectionDownAsync(Microsoft.AspNetCore.Components.Server.Circuits.Circuit circuit, System.Threading.CancellationToken cancellationToken) { throw null; } public virtual System.Threading.Tasks.Task OnConnectionDownAsync(Microsoft.AspNetCore.Components.Server.Circuits.Circuit circuit, System.Threading.CancellationToken cancellationToken) { throw null; }
public virtual System.Threading.Tasks.Task OnConnectionUpAsync(Microsoft.AspNetCore.Components.Server.Circuits.Circuit circuit, System.Threading.CancellationToken cancellationToken) { throw null; } public virtual System.Threading.Tasks.Task OnConnectionUpAsync(Microsoft.AspNetCore.Components.Server.Circuits.Circuit circuit, System.Threading.CancellationToken cancellationToken) { throw null; }
} }
public partial class RemoteUriHelper : Microsoft.AspNetCore.Components.UriHelperBase
{
public RemoteUriHelper(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Components.Server.Circuits.RemoteUriHelper> logger) { }
public bool HasAttachedJSRuntime { get { throw null; } }
public override void InitializeState(string uriAbsolute, string baseUriAbsolute) { }
protected override void NavigateToCore(string uri, bool forceLoad) { }
[Microsoft.JSInterop.JSInvokableAttribute("NotifyLocationChanged")]
public static void NotifyLocationChanged(string uriAbsolute, bool isInterceptedLink) { }
}
} }
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {

View File

@ -15,42 +15,6 @@ namespace Microsoft.AspNetCore.Builder
/// </summary> /// </summary>
public static class ComponentEndpointRouteBuilderExtensions public static class ComponentEndpointRouteBuilderExtensions
{ {
/// <summary>
/// Maps the Blazor <see cref="Hub" /> to the default path.
/// </summary>
/// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/>.</param>
/// <returns>The <see cref="ComponentEndpointConventionBuilder"/>.</returns>
public static ComponentEndpointConventionBuilder MapBlazorHub(this IEndpointRouteBuilder endpoints)
{
if (endpoints == null)
{
throw new ArgumentNullException(nameof(endpoints));
}
return endpoints.MapBlazorHub(configureOptions: _ => { });
}
/// <summary>
/// Maps the Blazor <see cref="Hub" /> to the default path.
/// </summary>
/// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/>.</param>
/// <param name="configureOptions">A callback to configure dispatcher options.</param>
/// <returns>The <see cref="ComponentEndpointConventionBuilder"/>.</returns>
public static ComponentEndpointConventionBuilder MapBlazorHub(this IEndpointRouteBuilder endpoints, Action<HttpConnectionDispatcherOptions> configureOptions)
{
if (endpoints == null)
{
throw new ArgumentNullException(nameof(endpoints));
}
if (configureOptions == null)
{
throw new ArgumentNullException(nameof(configureOptions));
}
return new ComponentEndpointConventionBuilder(endpoints.MapHub<ComponentHub>(ComponentHub.DefaultPath, configureOptions));
}
/// <summary> /// <summary>
///Maps the Blazor <see cref="Hub" /> to the default path and associates ///Maps the Blazor <see cref="Hub" /> to the default path and associates
/// the component <typeparamref name="TComponent"/> to this hub instance as the given DOM <paramref name="selector"/>. /// the component <typeparamref name="TComponent"/> to this hub instance as the given DOM <paramref name="selector"/>.

View File

@ -11,8 +11,8 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public abstract CircuitHost CreateCircuitHost( public abstract CircuitHost CreateCircuitHost(
HttpContext httpContext, HttpContext httpContext,
CircuitClientProxy client, CircuitClientProxy client,
string uriAbsolute, string baseUri,
string baseUriAbsolute, string uri,
ClaimsPrincipal user); ClaimsPrincipal user);
} }
} }

View File

@ -7,8 +7,6 @@ using System.Security.Claims;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Rendering;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Rendering; using Microsoft.AspNetCore.Components.Web.Rendering;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -19,31 +17,28 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
{ {
internal class CircuitHost : IAsyncDisposable internal class CircuitHost : IAsyncDisposable
{ {
private static readonly AsyncLocal<CircuitHost> _current = new AsyncLocal<CircuitHost>();
private readonly SemaphoreSlim HandlerLock = new SemaphoreSlim(1); private readonly SemaphoreSlim HandlerLock = new SemaphoreSlim(1);
private readonly IServiceScope _scope; private readonly IServiceScope _scope;
private readonly CircuitHandler[] _circuitHandlers; private readonly CircuitHandler[] _circuitHandlers;
private readonly ILogger _logger; private readonly ILogger _logger;
private bool _initialized; private bool _initialized;
/// <summary>
/// Gets the current <see cref="Circuit"/>, if any.
/// </summary>
public static CircuitHost Current => _current.Value;
/// <summary> /// <summary>
/// Sets the current <see cref="Circuits.Circuit"/>. /// Sets the current <see cref="Circuits.Circuit"/>.
/// </summary> /// </summary>
/// <param name="circuitHost">The <see cref="Circuits.Circuit"/>.</param> /// <param name="circuitHost">The <see cref="Circuits.Circuit"/>.</param>
/// <remarks> /// <remarks>
/// Calling <see cref="SetCurrentCircuitHost(CircuitHost)"/> will store the circuit /// Calling <see cref="SetCurrentCircuitHost(CircuitHost)"/> will store related values such as the
/// and other related values such as the <see cref="IJSRuntime"/> and <see cref="Renderer"/> /// <see cref="IJSRuntime"/> and <see cref="Renderer"/>
/// in the local execution context. Application code should not need to call this method, /// in the local execution context. Application code should not need to call this method,
/// it is primarily used by the Server-Side Components infrastructure. /// it is primarily used by the Server-Side Components infrastructure.
/// </remarks> /// </remarks>
public static void SetCurrentCircuitHost(CircuitHost circuitHost) public static void SetCurrentCircuitHost(CircuitHost circuitHost)
{ {
_current.Value = circuitHost ?? throw new ArgumentNullException(nameof(circuitHost)); if (circuitHost is null)
{
throw new ArgumentNullException(nameof(circuitHost));
}
JSInterop.JSRuntime.SetCurrentJSRuntime(circuitHost.JSRuntime); JSInterop.JSRuntime.SetCurrentJSRuntime(circuitHost.JSRuntime);
RendererRegistry.SetCurrentRendererRegistry(circuitHost.RendererRegistry); RendererRegistry.SetCurrentRendererRegistry(circuitHost.RendererRegistry);
@ -57,7 +52,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
CircuitClientProxy client, CircuitClientProxy client,
RendererRegistry rendererRegistry, RendererRegistry rendererRegistry,
RemoteRenderer renderer, RemoteRenderer renderer,
IList<ComponentDescriptor> descriptors, IReadOnlyList<ComponentDescriptor> descriptors,
RemoteJSRuntime jsRuntime, RemoteJSRuntime jsRuntime,
CircuitHandler[] circuitHandlers, CircuitHandler[] circuitHandlers,
ILogger logger) ILogger logger)
@ -92,24 +87,10 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public RendererRegistry RendererRegistry { get; } public RendererRegistry RendererRegistry { get; }
public IList<ComponentDescriptor> Descriptors { get; } public IReadOnlyList<ComponentDescriptor> Descriptors { get; }
public IServiceProvider Services { get; } public IServiceProvider Services { get; }
public Task<ComponentRenderedText> PrerenderComponentAsync(Type componentType, ParameterView parameters)
{
return Renderer.Dispatcher.InvokeAsync(async () =>
{
var result = await Renderer.RenderComponentAsync(componentType, parameters);
// When we prerender we start the circuit in a disconnected state. As such, we only call
// OnCircuitOpenenedAsync here and when the client reconnects we run OnConnectionUpAsync
await OnCircuitOpenedAsync(CancellationToken.None);
return result;
});
}
public void SetCircuitUser(ClaimsPrincipal user) public void SetCircuitUser(ClaimsPrincipal user)
{ {
var authenticationStateProvider = Services.GetService<AuthenticationStateProvider>() as IHostEnvironmentAuthenticationStateProvider; var authenticationStateProvider = Services.GetService<AuthenticationStateProvider>() as IHostEnvironmentAuthenticationStateProvider;
@ -120,26 +101,6 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
} }
} }
internal void InitializeCircuitAfterPrerender(UnhandledExceptionEventHandler unhandledException)
{
if (!_initialized)
{
_initialized = true;
UnhandledException += unhandledException;
var uriHelper = (RemoteUriHelper)Services.GetRequiredService<IUriHelper>();
if (!uriHelper.HasAttachedJSRuntime)
{
uriHelper.AttachJsRuntime(JSRuntime);
}
var navigationInterception = (RemoteNavigationInterception)Services.GetRequiredService<INavigationInterception>();
if (!navigationInterception.HasAttachedJSRuntime)
{
navigationInterception.AttachJSRuntime(JSRuntime);
}
}
}
internal void SendPendingBatches() internal void SendPendingBatches()
{ {
// Dispatch any buffered renders we accumulated during a disconnect. // Dispatch any buffered renders we accumulated during a disconnect.
@ -188,7 +149,6 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
return; return;
} }
await Renderer.Dispatcher.InvokeAsync(() => await Renderer.Dispatcher.InvokeAsync(() =>
{ {
SetCurrentCircuitHost(this); SetCurrentCircuitHost(this);
@ -233,13 +193,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
// That's because AddComponentAsync waits for quiescence, which can take // That's because AddComponentAsync waits for quiescence, which can take
// arbitrarily long. In the meantime we might need to be receiving and // arbitrarily long. In the meantime we might need to be receiving and
// processing incoming JSInterop calls or similar. // processing incoming JSInterop calls or similar.
for (var i = 0; i < Descriptors.Count; i++) var count = Descriptors.Count;
for (var i = 0; i < count; i++)
{ {
var (componentType, domElementSelector, prerendered) = Descriptors[i]; var (componentType, domElementSelector) = Descriptors[i];
if (!prerendered) await Renderer.AddComponentAsync(componentType, domElementSelector);
{
await Renderer.AddComponentAsync(componentType, domElementSelector);
}
} }
} }
catch (Exception ex) catch (Exception ex)
@ -256,7 +214,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
try try
{ {
AssertInitialized(); AssertInitialized();
if(assemblyName == "Microsoft.AspNetCore.Components.Web" && methodIdentifier == "DispatchEvent") if (assemblyName == "Microsoft.AspNetCore.Components.Web" && methodIdentifier == "DispatchEvent")
{ {
Log.DispatchEventTroughJSInterop(_logger); Log.DispatchEventTroughJSInterop(_logger);
return; return;
@ -271,6 +229,38 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
} }
catch (Exception ex) catch (Exception ex)
{ {
// We don't expect any of this code to actually throw, because DotNetDispatcher.BeginInvoke doesn't throw
// however, we still want this to get logged if we do.
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
}
}
public async Task OnLocationChangedAsync(string uri, bool intercepted)
{
try
{
AssertInitialized();
await Renderer.Dispatcher.InvokeAsync(() =>
{
SetCurrentCircuitHost(this);
Log.LocationChange(_logger, CircuitId, uri);
var navigationManager = (RemoteNavigationManager)Services.GetRequiredService<NavigationManager>();
navigationManager.NotifyLocationChanged(uri, intercepted);
Log.LocationChangeSucceeded(_logger, CircuitId, uri);
});
}
catch (Exception ex)
{
// It's up to the NavigationManager implementation to validate the URI.
//
// Note that it's also possible that setting the URI could cause a failure in code that listens
// to NavigationManager.LocationChanged.
//
// In either case, a well-behaved client will not send invalid URIs, and we don't really
// want to continue processing with the circuit if setting the URI failed inside application
// code. The safest thing to do is consider it a critical failure since URI is global state,
// and a failure means that an update to global state was partially applied.
Log.LocationChangeFailed(_logger, CircuitId, uri, ex);
UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false)); UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
} }
} }
@ -423,6 +413,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
private static readonly Action<ILogger, Exception> _dispatchEventFailedToParseEventDescriptor; private static readonly Action<ILogger, Exception> _dispatchEventFailedToParseEventDescriptor;
private static readonly Action<ILogger, string, Exception> _dispatchEventFailedToDispatchEvent; private static readonly Action<ILogger, string, Exception> _dispatchEventFailedToDispatchEvent;
private static readonly Action<ILogger, Exception> _dispatchEventThroughJSInterop; private static readonly Action<ILogger, Exception> _dispatchEventThroughJSInterop;
private static readonly Action<ILogger, string, string, Exception> _locationChange;
private static readonly Action<ILogger, string, string, Exception> _locationChangeSucceeded;
private static readonly Action<ILogger, string, string, Exception> _locationChangeFailed;
private static class EventIds private static class EventIds
{ {
@ -440,6 +433,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public static readonly EventId EndInvokeJSFailed = new EventId(111, "EndInvokeJSFailed"); public static readonly EventId EndInvokeJSFailed = new EventId(111, "EndInvokeJSFailed");
public static readonly EventId EndInvokeJSSucceeded = new EventId(112, "EndInvokeJSSucceeded"); public static readonly EventId EndInvokeJSSucceeded = new EventId(112, "EndInvokeJSSucceeded");
public static readonly EventId DispatchEventThroughJSInterop = new EventId(113, "DispatchEventThroughJSInterop"); public static readonly EventId DispatchEventThroughJSInterop = new EventId(113, "DispatchEventThroughJSInterop");
public static readonly EventId LocationChange = new EventId(114, "LocationChange");
public static readonly EventId LocationChangeSucceded = new EventId(115, "LocationChangeSucceeded");
public static readonly EventId LocationChangeFailed = new EventId(116, "LocationChangeFailed");
} }
static Log() static Log()
@ -513,6 +509,21 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
LogLevel.Debug, LogLevel.Debug,
EventIds.DispatchEventThroughJSInterop, EventIds.DispatchEventThroughJSInterop,
"There was an intent to dispatch a browser event through JS interop."); "There was an intent to dispatch a browser event through JS interop.");
_locationChange = LoggerMessage.Define<string, string>(
LogLevel.Debug,
EventIds.LocationChange,
"Location changing to {URI} in {CircuitId}.");
_locationChangeSucceeded = LoggerMessage.Define<string, string>(
LogLevel.Debug,
EventIds.LocationChangeSucceded,
"Location change to {URI} in {CircuitId} succeded.");
_locationChangeFailed = LoggerMessage.Define<string, string>(
LogLevel.Debug,
EventIds.LocationChangeFailed,
"Location change to {URI} in {CircuitId} failed.");
} }
public static void UnhandledExceptionInvokingCircuitHandler(ILogger logger, CircuitHandler handler, string handlerMethod, Exception exception) public static void UnhandledExceptionInvokingCircuitHandler(ILogger logger, CircuitHandler handler, string handlerMethod, Exception exception)
@ -560,8 +571,13 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
} }
} }
public static void DispatchEventTroughJSInterop(ILogger logger) => public static void DispatchEventTroughJSInterop(ILogger logger) => _dispatchEventThroughJSInterop(logger, null);
_dispatchEventThroughJSInterop(logger, null);
public static void LocationChange(ILogger logger, string circuitId, string uri) => _locationChange(logger, circuitId, uri, null);
public static void LocationChangeSucceeded(ILogger logger, string circuitId, string uri) => _locationChangeSucceeded(logger, circuitId, uri, null);
public static void LocationChangeFailed(ILogger logger, string circuitId, string uri, Exception exception) => _locationChangeFailed(logger, circuitId, uri, exception);
} }
} }
} }

View File

@ -1,207 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Linq;
using System.Runtime.ExceptionServices;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Rendering;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
namespace Microsoft.AspNetCore.Components.Server.Circuits
{
internal class CircuitPrerenderer : IComponentPrerenderer
{
private static object CircuitHostKey = new object();
private static object CancellationStatusKey = new object();
private static readonly JsonSerializerOptions _jsonSerializationOptions =
new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
private readonly CircuitFactory _circuitFactory;
private readonly CircuitRegistry _registry;
public CircuitPrerenderer(
CircuitFactory circuitFactory,
CircuitRegistry registry)
{
_circuitFactory = circuitFactory;
_registry = registry;
}
public async Task<ComponentPrerenderResult> PrerenderComponentAsync(ComponentPrerenderingContext prerenderingContext)
{
var context = prerenderingContext.Context;
var cancellationStatus = GetOrCreateCancellationStatus(context);
if (cancellationStatus.Canceled)
{
// Avoid creating a circuit host if other component earlier in the pipeline already triggered
// cancellation (e.g., by navigating or throwing). Instead render nothing.
return new ComponentPrerenderResult(Array.Empty<string>());
}
var circuitHost = GetOrCreateCircuitHost(context, cancellationStatus);
ComponentRenderedText renderResult;
try
{
renderResult = await circuitHost.PrerenderComponentAsync(
prerenderingContext.ComponentType,
prerenderingContext.Parameters);
}
catch (NavigationException navigationException)
{
// Cleanup the state as we won't need it any longer.
// Signal callbacks that we don't have to register the circuit.
await CleanupCircuitState(context, cancellationStatus, circuitHost);
// Navigation was attempted during prerendering.
if (prerenderingContext.Context.Response.HasStarted)
{
// We can't perform a redirect as the server already started sending the response.
// This is considered an application error as the developer should buffer the response until
// all components have rendered.
throw new InvalidOperationException("A navigation command was attempted during prerendering after the server already started sending the response. " +
"Navigation commands can not be issued during server-side prerendering after the response from the server has started. Applications must buffer the" +
"reponse and avoid using features like FlushAsync() before all components on the page have been rendered to prevent failed navigation commands.", navigationException);
}
context.Response.Redirect(navigationException.Location);
return new ComponentPrerenderResult(Array.Empty<string>());
}
catch
{
// If prerendering any component fails, cancel prerendering entirely and dispose the DI scope
await CleanupCircuitState(context, cancellationStatus, circuitHost);
throw;
}
circuitHost.Descriptors.Add(new ComponentDescriptor
{
ComponentType = prerenderingContext.ComponentType,
Prerendered = true
});
var record = JsonSerializer.Serialize(new PrerenderedComponentRecord(
// We need to do this due to the fact that -- is not allowed within HTML comments and HTML doesn't encode '-'.
// We will never have '..' sequences because we Base64UrlEncode the circuit id
circuitHost.CircuitId.Replace("--", ".."),
circuitHost.Renderer.Id,
renderResult.ComponentId),
_jsonSerializationOptions);
var result = (new[] {
$"<!-- M.A.C.Component: {record} -->",
}).Concat(renderResult.Tokens).Concat(
new[] {
$"<!-- M.A.C.Component: {renderResult.ComponentId} -->"
});
return new ComponentPrerenderResult(result);
}
private PrerenderingCancellationStatus GetOrCreateCancellationStatus(HttpContext context)
{
if (context.Items.TryGetValue(CancellationStatusKey, out var existingValue))
{
return (PrerenderingCancellationStatus)existingValue;
}
else
{
var cancellationStatus = new PrerenderingCancellationStatus();
context.Items[CancellationStatusKey] = cancellationStatus;
return cancellationStatus;
}
}
private static async Task CleanupCircuitState(HttpContext context, PrerenderingCancellationStatus cancellationStatus, CircuitHost circuitHost)
{
cancellationStatus.Canceled = true;
context.Items.Remove(CircuitHostKey);
await circuitHost.DisposeAsync();
}
private CircuitHost GetOrCreateCircuitHost(HttpContext context, PrerenderingCancellationStatus cancellationStatus)
{
if (context.Items.TryGetValue(CircuitHostKey, out var existingHost))
{
return (CircuitHost)existingHost;
}
else
{
var result = _circuitFactory.CreateCircuitHost(
context,
client: new CircuitClientProxy(), // This creates an "offline" client.
GetFullUri(context.Request),
GetFullBaseUri(context.Request),
context.User);
result.UnhandledException += CircuitHost_UnhandledException;
context.Response.OnCompleted(() =>
{
result.UnhandledException -= CircuitHost_UnhandledException;
if (!cancellationStatus.Canceled)
{
_registry.RegisterDisconnectedCircuit(result);
}
return Task.CompletedTask;
});
context.Items.Add(CircuitHostKey, result);
return result;
}
}
private void CircuitHost_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// Throw all exceptions encountered during pre-rendering so the default developer
// error page can respond.
ExceptionDispatchInfo.Capture((Exception)e.ExceptionObject).Throw();
}
private string GetFullUri(HttpRequest request)
{
return UriHelper.BuildAbsolute(
request.Scheme,
request.Host,
request.PathBase,
request.Path,
request.QueryString);
}
private string GetFullBaseUri(HttpRequest request)
{
var result = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase);
// PathBase may be "/" or "/some/thing", but to be a well-formed base URI
// it has to end with a trailing slash
if (!result.EndsWith('/'))
{
result += '/';
}
return result;
}
private readonly struct PrerenderedComponentRecord
{
public PrerenderedComponentRecord(string circuitId, int rendererId, int componentId)
{
CircuitId = circuitId;
RendererId = rendererId;
ComponentId = componentId;
}
public string CircuitId { get; }
public int RendererId { get; }
public int ComponentId { get; }
}
private class PrerenderingCancellationStatus
{
public bool Canceled { get; set; }
}
}
}

View File

@ -81,6 +81,15 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
} }
} }
public void PermanentDisconnect(CircuitHost circuitHost)
{
if (ConnectedCircuits.TryRemove(circuitHost.CircuitId, out _))
{
Log.CircuitDisconnectedPermanently(_logger, circuitHost.CircuitId);
circuitHost.Client.SetDisconnected();
}
}
public virtual Task DisconnectAsync(CircuitHost circuitHost, string connectionId) public virtual Task DisconnectAsync(CircuitHost circuitHost, string connectionId)
{ {
Log.CircuitDisconnectStarted(_logger, circuitHost.CircuitId, connectionId); Log.CircuitDisconnectStarted(_logger, circuitHost.CircuitId, connectionId);
@ -314,6 +323,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
private static readonly Action<ILogger, string, Exception> _circuitNotActive; private static readonly Action<ILogger, string, Exception> _circuitNotActive;
private static readonly Action<ILogger, string, string, Exception> _circuitConnectedToDifferentConnection; private static readonly Action<ILogger, string, string, Exception> _circuitConnectedToDifferentConnection;
private static readonly Action<ILogger, string, Exception> _circuitMarkedDisconnected; private static readonly Action<ILogger, string, Exception> _circuitMarkedDisconnected;
private static readonly Action<ILogger, string, Exception> _circuitDisconnectedPermanently;
private static readonly Action<ILogger, string, EvictionReason, Exception> _circuitEvicted; private static readonly Action<ILogger, string, EvictionReason, Exception> _circuitEvicted;
private static class EventIds private static class EventIds
@ -330,6 +340,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public static readonly EventId CircuitConnectedToDifferentConnection = new EventId(109, "CircuitConnectedToDifferentConnection"); public static readonly EventId CircuitConnectedToDifferentConnection = new EventId(109, "CircuitConnectedToDifferentConnection");
public static readonly EventId CircuitMarkedDisconnected = new EventId(110, "CircuitMarkedDisconnected"); public static readonly EventId CircuitMarkedDisconnected = new EventId(110, "CircuitMarkedDisconnected");
public static readonly EventId CircuitEvicted = new EventId(111, "CircuitEvicted"); public static readonly EventId CircuitEvicted = new EventId(111, "CircuitEvicted");
public static readonly EventId CircuitDisconnectedPermanently = new EventId(112, "CircuitDisconnectedPermanently");
} }
static Log() static Log()
@ -394,6 +405,11 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
EventIds.CircuitMarkedDisconnected, EventIds.CircuitMarkedDisconnected,
"Circuit with id {CircuitId} is disconnected."); "Circuit with id {CircuitId} is disconnected.");
_circuitDisconnectedPermanently = LoggerMessage.Define<string>(
LogLevel.Debug,
EventIds.CircuitDisconnectedPermanently,
"Circuit with id {CircuitId} has been removed from the registry for permanent disconnection.");
_circuitEvicted = LoggerMessage.Define<string, EvictionReason>( _circuitEvicted = LoggerMessage.Define<string, EvictionReason>(
LogLevel.Debug, LogLevel.Debug,
EventIds.CircuitEvicted, EventIds.CircuitEvicted,
@ -436,6 +452,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public static void CircuitMarkedDisconnected(ILogger logger, string circuitId) => public static void CircuitMarkedDisconnected(ILogger logger, string circuitId) =>
_circuitMarkedDisconnected(logger, circuitId, null); _circuitMarkedDisconnected(logger, circuitId, null);
public static void CircuitDisconnectedPermanently(ILogger logger, string circuitId) =>
_circuitDisconnectedPermanently(logger, circuitId, null);
public static void CircuitEvicted(ILogger logger, string circuitId, EvictionReason evictionReason) => public static void CircuitEvicted(ILogger logger, string circuitId, EvictionReason evictionReason) =>
_circuitEvicted(logger, circuitId, evictionReason, null); _circuitEvicted(logger, circuitId, evictionReason, null);
} }

View File

@ -14,6 +14,7 @@ using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Components.Server.Circuits namespace Microsoft.AspNetCore.Components.Server.Circuits
{ {
@ -38,10 +39,12 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public override CircuitHost CreateCircuitHost( public override CircuitHost CreateCircuitHost(
HttpContext httpContext, HttpContext httpContext,
CircuitClientProxy client, CircuitClientProxy client,
string uriAbsolute, string baseUri,
string baseUriAbsolute, string uri,
ClaimsPrincipal user) ClaimsPrincipal user)
{ {
// We do as much intialization as possible eagerly in this method, which makes the error handling
// story much simpler. If we throw from here, it's handled inside the initial hub method.
var components = ResolveComponentMetadata(httpContext, client); var components = ResolveComponentMetadata(httpContext, client);
var scope = _scopeFactory.CreateScope(); var scope = _scopeFactory.CreateScope();
@ -51,20 +54,25 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
jsRuntime.Initialize(client); jsRuntime.Initialize(client);
componentContext.Initialize(client); componentContext.Initialize(client);
var uriHelper = (RemoteUriHelper)scope.ServiceProvider.GetRequiredService<IUriHelper>(); var authenticationStateProvider = scope.ServiceProvider.GetService<AuthenticationStateProvider>() as IHostEnvironmentAuthenticationStateProvider;
if (authenticationStateProvider != null)
{
var authenticationState = new AuthenticationState(httpContext.User); // TODO: Get this from the hub connection context instead
authenticationStateProvider.SetAuthenticationState(Task.FromResult(authenticationState));
}
var navigationManager = (RemoteNavigationManager)scope.ServiceProvider.GetRequiredService<NavigationManager>();
var navigationInterception = (RemoteNavigationInterception)scope.ServiceProvider.GetRequiredService<INavigationInterception>(); var navigationInterception = (RemoteNavigationInterception)scope.ServiceProvider.GetRequiredService<INavigationInterception>();
if (client.Connected) if (client.Connected)
{ {
uriHelper.AttachJsRuntime(jsRuntime); navigationManager.AttachJsRuntime(jsRuntime);
uriHelper.InitializeState( navigationManager.Initialize(baseUri, uri);
uriAbsolute,
baseUriAbsolute);
navigationInterception.AttachJSRuntime(jsRuntime); navigationInterception.AttachJSRuntime(jsRuntime);
} }
else else
{ {
uriHelper.InitializeState(uriAbsolute, baseUriAbsolute); navigationManager.Initialize(baseUri, uri);
} }
var rendererRegistry = new RendererRegistry(); var rendererRegistry = new RendererRegistry();
@ -100,7 +108,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
return circuitHost; return circuitHost;
} }
internal static IList<ComponentDescriptor> ResolveComponentMetadata(HttpContext httpContext, CircuitClientProxy client) internal static List<ComponentDescriptor> ResolveComponentMetadata(HttpContext httpContext, CircuitClientProxy client)
{ {
if (!client.Connected) if (!client.Connected)
{ {

View File

@ -5,7 +5,7 @@ using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Components.Routing;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using Interop = Microsoft.AspNetCore.Components.Web.BrowserUriHelperInterop; using Interop = Microsoft.AspNetCore.Components.Web.BrowserNavigationManagerInterop;
namespace Microsoft.AspNetCore.Components.Server.Circuits namespace Microsoft.AspNetCore.Components.Server.Circuits
{ {

View File

@ -2,26 +2,26 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System; using System;
using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Components.Routing;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.JSInterop; using Microsoft.JSInterop;
using Interop = Microsoft.AspNetCore.Components.Web.BrowserUriHelperInterop; using Interop = Microsoft.AspNetCore.Components.Web.BrowserNavigationManagerInterop;
namespace Microsoft.AspNetCore.Components.Server.Circuits namespace Microsoft.AspNetCore.Components.Server.Circuits
{ {
/// <summary> /// <summary>
/// A Server-Side Components implementation of <see cref="IUriHelper"/>. /// A Server-Side Blazor implementation of <see cref="NavigationManager"/>.
/// </summary> /// </summary>
public class RemoteUriHelper : UriHelperBase internal class RemoteNavigationManager : NavigationManager, IHostEnvironmentNavigationManager
{ {
private readonly ILogger<RemoteUriHelper> _logger; private readonly ILogger<RemoteNavigationManager> _logger;
private IJSRuntime _jsRuntime; private IJSRuntime _jsRuntime;
/// <summary> /// <summary>
/// Creates a new <see cref="RemoteUriHelper"/> instance. /// Creates a new <see cref="RemoteNavigationManager"/> instance.
/// </summary> /// </summary>
/// <param name="logger">The <see cref="ILogger{TCategoryName}"/>.</param> /// <param name="logger">The <see cref="ILogger{TCategoryName}"/>.</param>
public RemoteUriHelper(ILogger<RemoteUriHelper> logger) public RemoteNavigationManager(ILogger<RemoteNavigationManager> logger)
{ {
_logger = logger; _logger = logger;
} }
@ -32,21 +32,21 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
public bool HasAttachedJSRuntime => _jsRuntime != null; public bool HasAttachedJSRuntime => _jsRuntime != null;
/// <summary> /// <summary>
/// Initializes the <see cref="RemoteUriHelper"/>. /// Initializes the <see cref="NavigationManager" />.
/// </summary> /// </summary>
/// <param name="uriAbsolute">The absolute URI of the current page.</param> /// <param name="baseUri">The base URI.</param>
/// <param name="baseUriAbsolute">The absolute base URI of the current page.</param> /// <param name="uri">The absolute URI.</param>
public override void InitializeState(string uriAbsolute, string baseUriAbsolute) public new void Initialize(string baseUri, string uri)
{ {
base.InitializeState(uriAbsolute, baseUriAbsolute); base.Initialize(baseUri, uri);
TriggerOnLocationChanged(isinterceptedLink: false); NotifyLocationChanged(isInterceptedLink: false);
} }
/// <summary> /// <summary>
/// Initializes the <see cref="RemoteUriHelper"/>. /// Initializes the <see cref="RemoteNavigationManager"/>.
/// </summary> /// </summary>
/// <param name="jsRuntime">The <see cref="IJSRuntime"/> to use for interoperability.</param> /// <param name="jsRuntime">The <see cref="IJSRuntime"/> to use for interoperability.</param>
internal void AttachJsRuntime(IJSRuntime jsRuntime) public void AttachJsRuntime(IJSRuntime jsRuntime)
{ {
if (_jsRuntime != null) if (_jsRuntime != null)
{ {
@ -54,31 +54,14 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
} }
_jsRuntime = jsRuntime; _jsRuntime = jsRuntime;
_jsRuntime.InvokeAsync<object>(
Interop.ListenForNavigationEvents,
typeof(RemoteUriHelper).Assembly.GetName().Name,
nameof(NotifyLocationChanged));
} }
/// <summary> public void NotifyLocationChanged(string uri, bool intercepted)
/// For framework use only.
/// </summary>
[JSInvokable(nameof(NotifyLocationChanged))]
public static void NotifyLocationChanged(string uriAbsolute, bool isInterceptedLink)
{ {
var circuit = CircuitHost.Current; Log.ReceivedLocationChangedNotification(_logger, uri, intercepted);
if (circuit == null)
{
var message = $"{nameof(NotifyLocationChanged)} called without a circuit.";
throw new InvalidOperationException(message);
}
var uriHelper = (RemoteUriHelper)circuit.Services.GetRequiredService<IUriHelper>(); Uri = uri;
Log.ReceivedLocationChangedNotification(uriHelper._logger, uriAbsolute, isInterceptedLink); NotifyLocationChanged(intercepted);
uriHelper.SetAbsoluteUri(uriAbsolute);
uriHelper.TriggerOnLocationChanged(isInterceptedLink);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using System.Threading; using System.Threading;
@ -10,6 +11,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Rendering; using Microsoft.AspNetCore.Components.Rendering;
using Microsoft.AspNetCore.Components.Server.Circuits; using Microsoft.AspNetCore.Components.Server.Circuits;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.JSInterop; using Microsoft.JSInterop;
@ -138,7 +140,8 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
pendingRender = new UnacknowledgedRenderBatch( pendingRender = new UnacknowledgedRenderBatch(
renderId, renderId,
arrayBuilder, arrayBuilder,
new TaskCompletionSource<object>()); new TaskCompletionSource<object>(),
ValueStopwatch.StartNew());
// Buffer the rendered batches no matter what. We'll send it down immediately when the client // Buffer the rendered batches no matter what. We'll send it down immediately when the client
// is connected or right after the client reconnects. // is connected or right after the client reconnects.
@ -256,13 +259,14 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
private void ProcessPendingBatch(string errorMessageOrNull, UnacknowledgedRenderBatch entry) private void ProcessPendingBatch(string errorMessageOrNull, UnacknowledgedRenderBatch entry)
{ {
var elapsedTime = entry.ValueStopwatch.GetElapsedTime();
if (errorMessageOrNull == null) if (errorMessageOrNull == null)
{ {
Log.CompletingBatchWithoutError(_logger, entry.BatchId); Log.CompletingBatchWithoutError(_logger, entry.BatchId, elapsedTime);
} }
else else
{ {
Log.CompletingBatchWithError(_logger, entry.BatchId, errorMessageOrNull); Log.CompletingBatchWithError(_logger, entry.BatchId, errorMessageOrNull, elapsedTime);
} }
entry.Data.Dispose(); entry.Data.Dispose();
@ -283,16 +287,18 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
internal readonly struct UnacknowledgedRenderBatch internal readonly struct UnacknowledgedRenderBatch
{ {
public UnacknowledgedRenderBatch(long batchId, ArrayBuilder<byte> data, TaskCompletionSource<object> completionSource) public UnacknowledgedRenderBatch(long batchId, ArrayBuilder<byte> data, TaskCompletionSource<object> completionSource, ValueStopwatch valueStopwatch)
{ {
BatchId = batchId; BatchId = batchId;
Data = data; Data = data;
CompletionSource = completionSource; CompletionSource = completionSource;
ValueStopwatch = valueStopwatch;
} }
public long BatchId { get; } public long BatchId { get; }
public ArrayBuilder<byte> Data { get; } public ArrayBuilder<byte> Data { get; }
public TaskCompletionSource<object> CompletionSource { get; } public TaskCompletionSource<object> CompletionSource { get; }
public ValueStopwatch ValueStopwatch { get; }
} }
private void CaptureAsyncExceptions(Task task) private void CaptureAsyncExceptions(Task task)
@ -312,8 +318,8 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
private static readonly Action<ILogger, long, int, string, Exception> _beginUpdateDisplayAsync; private static readonly Action<ILogger, long, int, string, Exception> _beginUpdateDisplayAsync;
private static readonly Action<ILogger, string, Exception> _bufferingRenderDisconnectedClient; private static readonly Action<ILogger, string, Exception> _bufferingRenderDisconnectedClient;
private static readonly Action<ILogger, string, Exception> _sendBatchDataFailed; private static readonly Action<ILogger, string, Exception> _sendBatchDataFailed;
private static readonly Action<ILogger, long, string, Exception> _completingBatchWithError; private static readonly Action<ILogger, long, string, double, Exception> _completingBatchWithError;
private static readonly Action<ILogger, long, Exception> _completingBatchWithoutError; private static readonly Action<ILogger, long, double, Exception> _completingBatchWithoutError;
private static readonly Action<ILogger, long, Exception> _receivedDuplicateBatchAcknowledgement; private static readonly Action<ILogger, long, Exception> _receivedDuplicateBatchAcknowledgement;
private static class EventIds private static class EventIds
@ -349,15 +355,15 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
EventIds.SendBatchDataFailed, EventIds.SendBatchDataFailed,
"Sending data for batch failed: {Message}"); "Sending data for batch failed: {Message}");
_completingBatchWithError = LoggerMessage.Define<long, string>( _completingBatchWithError = LoggerMessage.Define<long, string, double>(
LogLevel.Debug, LogLevel.Debug,
EventIds.CompletingBatchWithError, EventIds.CompletingBatchWithError,
"Completing batch {BatchId} with error: {ErrorMessage}"); "Completing batch {BatchId} with error: {ErrorMessage} in {ElapsedMilliseconds}ms.");
_completingBatchWithoutError = LoggerMessage.Define<long>( _completingBatchWithoutError = LoggerMessage.Define<long, double>(
LogLevel.Debug, LogLevel.Debug,
EventIds.CompletingBatchWithoutError, EventIds.CompletingBatchWithoutError,
"Completing batch {BatchId} without error"); "Completing batch {BatchId} without error in {ElapsedMilliseconds}ms.");
_receivedDuplicateBatchAcknowledgement = LoggerMessage.Define<long>( _receivedDuplicateBatchAcknowledgement = LoggerMessage.Define<long>(
LogLevel.Debug, LogLevel.Debug,
@ -396,20 +402,22 @@ namespace Microsoft.AspNetCore.Components.Web.Rendering
null); null);
} }
public static void CompletingBatchWithError(ILogger logger, long batchId, string errorMessage) public static void CompletingBatchWithError(ILogger logger, long batchId, string errorMessage, TimeSpan elapsedTime)
{ {
_completingBatchWithError( _completingBatchWithError(
logger, logger,
batchId, batchId,
errorMessage, errorMessage,
elapsedTime.TotalMilliseconds,
null); null);
} }
public static void CompletingBatchWithoutError(ILogger logger, long batchId) public static void CompletingBatchWithoutError(ILogger logger, long batchId, TimeSpan elapsedTime)
{ {
_completingBatchWithoutError( _completingBatchWithoutError(
logger, logger,
batchId, batchId,
elapsedTime.TotalMilliseconds,
null); null);
} }

View File

@ -11,13 +11,10 @@ namespace Microsoft.AspNetCore.Components.Server
public string Selector { get; set; } public string Selector { get; set; }
public bool Prerendered { get; set; } public void Deconstruct(out Type componentType, out string selector)
public void Deconstruct(out Type componentType, out string selector, out bool prerendered)
{ {
componentType = ComponentType; componentType = ComponentType;
selector = Selector; selector = Selector;
prerendered = Prerendered;
} }
} }
} }

View File

@ -48,6 +48,9 @@ namespace Microsoft.AspNetCore.Components.Server
/// <summary> /// <summary>
/// For unit testing only. /// For unit testing only.
/// </summary> /// </summary>
// We store the circuit host in Context.Items which is tied to the lifetime of the underlying
// SignalR connection. There's no need to clean this up, it's a non-owning reference and it
// will go away when the connection does.
internal CircuitHost CircuitHost internal CircuitHost CircuitHost
{ {
get => (CircuitHost)Context.Items[CircuitKey]; get => (CircuitHost)Context.Items[CircuitKey];
@ -65,14 +68,40 @@ namespace Microsoft.AspNetCore.Components.Server
return Task.CompletedTask; return Task.CompletedTask;
} }
CircuitHost = null; if (exception != null)
return _circuitRegistry.DisconnectAsync(circuitHost, Context.ConnectionId); {
return _circuitRegistry.DisconnectAsync(circuitHost, Context.ConnectionId);
}
else
{
// The client will gracefully disconnect when using websockets by correctly closing the TCP connection.
// This happens when the user closes a tab, navigates away from the page or reloads the page.
// In these situations we know the user is done with the circuit, so we can get rid of it at that point.
// This is important to be able to more efficiently manage resources, specially memory.
return TerminateCircuitGracefully(circuitHost);
}
}
private async Task TerminateCircuitGracefully(CircuitHost circuitHost)
{
try
{
Log.CircuitTerminatedGracefully(_logger, circuitHost.CircuitId);
_circuitRegistry.PermanentDisconnect(circuitHost);
await circuitHost.DisposeAsync();
}
catch (Exception e)
{
Log.UnhandledExceptionInCircuit(_logger, circuitHost.CircuitId, e);
}
await _circuitRegistry.DisconnectAsync(circuitHost, Context.ConnectionId);
} }
/// <summary> /// <summary>
/// Intended for framework use only. Applications should not call this method directly. /// Intended for framework use only. Applications should not call this method directly.
/// </summary> /// </summary>
public string StartCircuit(string uriAbsolute, string baseUriAbsolute) public string StartCircuit(string baseUri, string uri)
{ {
if (CircuitHost != null) if (CircuitHost != null)
{ {
@ -81,6 +110,18 @@ namespace Microsoft.AspNetCore.Components.Server
return null; return null;
} }
if (baseUri == null ||
uri == null ||
!Uri.IsWellFormedUriString(baseUri, UriKind.Absolute) ||
!Uri.IsWellFormedUriString(uri, UriKind.Absolute))
{
// We do some really minimal validation here to prevent obviously wrong data from getting in
// without duplicating too much logic.
Log.InvalidInputData(_logger);
_ = NotifyClientError(Clients.Caller, $"The uris provided are invalid.");
return null;
}
var circuitClient = new CircuitClientProxy(Clients.Caller, Context.ConnectionId); var circuitClient = new CircuitClientProxy(Clients.Caller, Context.ConnectionId);
if (DefaultCircuitFactory.ResolveComponentMetadata(Context.GetHttpContext(), circuitClient).Count == 0) if (DefaultCircuitFactory.ResolveComponentMetadata(Context.GetHttpContext(), circuitClient).Count == 0)
{ {
@ -93,26 +134,35 @@ namespace Microsoft.AspNetCore.Components.Server
return null; return null;
} }
var circuitHost = _circuitFactory.CreateCircuitHost( try
Context.GetHttpContext(), {
circuitClient, var circuitHost = _circuitFactory.CreateCircuitHost(
uriAbsolute, Context.GetHttpContext(),
baseUriAbsolute, circuitClient,
Context.User); baseUri,
uri,
Context.User);
circuitHost.UnhandledException += CircuitHost_UnhandledException; circuitHost.UnhandledException += CircuitHost_UnhandledException;
// Fire-and-forget the initialization process, because we can't block the // Fire-and-forget the initialization process, because we can't block the
// SignalR message loop (we'd get a deadlock if any of the initialization // SignalR message loop (we'd get a deadlock if any of the initialization
// logic relied on receiving a subsequent message from SignalR), and it will // logic relied on receiving a subsequent message from SignalR), and it will
// take care of its own errors anyway. // take care of its own errors anyway.
_ = circuitHost.InitializeAsync(Context.ConnectionAborted); _ = circuitHost.InitializeAsync(Context.ConnectionAborted);
_circuitRegistry.Register(circuitHost); // It's safe to *publish* the circuit now because nothing will be able
// to run inside it until after InitializeAsync completes.
CircuitHost = circuitHost; _circuitRegistry.Register(circuitHost);
CircuitHost = circuitHost;
return circuitHost.CircuitId; return circuitHost.CircuitId;
}
catch (Exception ex)
{
Log.CircuitInitializationFailed(_logger, ex);
NotifyClientError(Clients.Caller, "The circuit failed to initialize.");
return null;
}
} }
/// <summary> /// <summary>
@ -124,8 +174,8 @@ namespace Microsoft.AspNetCore.Components.Server
if (circuitHost != null) if (circuitHost != null)
{ {
CircuitHost = circuitHost; CircuitHost = circuitHost;
CircuitHost.UnhandledException += CircuitHost_UnhandledException;
circuitHost.InitializeCircuitAfterPrerender(CircuitHost_UnhandledException);
circuitHost.SetCircuitUser(Context.User); circuitHost.SetCircuitUser(Context.User);
circuitHost.SendPendingBatches(); circuitHost.SendPendingBatches();
return true; return true;
@ -195,6 +245,18 @@ namespace Microsoft.AspNetCore.Components.Server
CircuitHost.Renderer.OnRenderCompleted(renderId, errorMessageOrNull); CircuitHost.Renderer.OnRenderCompleted(renderId, errorMessageOrNull);
} }
public void OnLocationChanged(string uri, bool intercepted)
{
if (CircuitHost == null)
{
Log.CircuitHostNotInitialized(_logger);
NotifyClientError(Clients.Caller, "Circuit not initialized.");
return;
}
_ = CircuitHost.OnLocationChangedAsync(uri, intercepted);
}
private async void CircuitHost_UnhandledException(object sender, UnhandledExceptionEventArgs e) private async void CircuitHost_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{ {
var circuitHost = (CircuitHost)sender; var circuitHost = (CircuitHost)sender;
@ -246,8 +308,16 @@ namespace Microsoft.AspNetCore.Components.Server
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(5, "CircuitAlreadyInitialized"), "The circuit host '{CircuitId}' has already been initialized"); LoggerMessage.Define<string>(LogLevel.Debug, new EventId(5, "CircuitAlreadyInitialized"), "The circuit host '{CircuitId}' has already been initialized");
private static readonly Action<ILogger, string, Exception> _circuitHostNotInitialized = private static readonly Action<ILogger, string, Exception> _circuitHostNotInitialized =
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(6, "CircuitHostNotInitialized"), "Call to '{CallSite}' received before the circuit host initialization."); LoggerMessage.Define<string>(LogLevel.Debug, new EventId(6, "CircuitHostNotInitialized"), "Call to '{CallSite}' received before the circuit host initialization");
private static readonly Action<ILogger, string, Exception> _circuitTerminatedGracefully =
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(7, "CircuitTerminatedGracefully"), "Circuit '{CircuitId}' terminated gracefully");
private static readonly Action<ILogger, string, Exception> _invalidInputData =
LoggerMessage.Define<string>(LogLevel.Debug, new EventId(8, "InvalidInputData"), "Call to '{CallSite}' received invalid input data");
private static readonly Action<ILogger, Exception> _circuitInitializationFailed =
LoggerMessage.Define(LogLevel.Debug, new EventId(9, "CircuitInitializationFailed"), "Circuit initialization failed");
public static void NoComponentsRegisteredInEndpoint(ILogger logger, string endpointDisplayName) public static void NoComponentsRegisteredInEndpoint(ILogger logger, string endpointDisplayName)
{ {
@ -272,6 +342,12 @@ namespace Microsoft.AspNetCore.Components.Server
public static void CircuitAlreadyInitialized(ILogger logger, string circuitId) => _circuitAlreadyInitialized(logger, circuitId, null); public static void CircuitAlreadyInitialized(ILogger logger, string circuitId) => _circuitAlreadyInitialized(logger, circuitId, null);
public static void CircuitHostNotInitialized(ILogger logger, [CallerMemberName] string callSite = "") => _circuitHostNotInitialized(logger, callSite, null); public static void CircuitHostNotInitialized(ILogger logger, [CallerMemberName] string callSite = "") => _circuitHostNotInitialized(logger, callSite, null);
public static void CircuitTerminatedGracefully(ILogger logger, string circuitId) => _circuitTerminatedGracefully(logger, circuitId, null);
public static void InvalidInputData(ILogger logger, [CallerMemberName] string callSite = "") => _invalidInputData(logger, callSite, null);
public static void CircuitInitializationFailed(ILogger logger, Exception exception) => _circuitInitializationFailed(logger, exception);
} }
} }
} }

View File

@ -63,16 +63,10 @@ namespace Microsoft.Extensions.DependencyInjection
services.TryAddSingleton<CircuitRegistry>(); services.TryAddSingleton<CircuitRegistry>();
// We explicitly take over the prerendering and components services here. // Standard blazor hosting services implementations
// We can't have two separate component implementations coexisting at the
// same time, so when you register components (Circuits) it takes over
// all the abstractions.
services.AddScoped<IComponentPrerenderer, CircuitPrerenderer>();
// Standard razor component services implementations
// //
// These intentionally replace the non-interactive versions included in MVC. // These intentionally replace the non-interactive versions included in MVC.
services.AddScoped<IUriHelper, RemoteUriHelper>(); services.AddScoped<NavigationManager, RemoteNavigationManager>();
services.AddScoped<IJSRuntime, RemoteJSRuntime>(); services.AddScoped<IJSRuntime, RemoteJSRuntime>();
services.AddScoped<INavigationInterception, RemoteNavigationInterception>(); services.AddScoped<INavigationInterception, RemoteNavigationInterception>();
services.AddScoped<IComponentContext, RemoteComponentContext>(); services.AddScoped<IComponentContext, RemoteComponentContext>();

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework> <TargetFramework>netcoreapp3.0</TargetFramework>
@ -14,12 +14,13 @@
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.AspNetCore.Components.Web" /> <Reference Include="Microsoft.AspNetCore.Components.Web" />
<Reference Include="Microsoft.AspNetCore.DataProtection" /> <Reference Include="Microsoft.AspNetCore.DataProtection" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.AspNetCore.SignalR" /> <Reference Include="Microsoft.AspNetCore.SignalR" />
<Reference Include="Microsoft.AspNetCore.StaticFiles" /> <Reference Include="Microsoft.AspNetCore.StaticFiles" />
<Reference Include="Microsoft.Extensions.Caching.Memory" /> <Reference Include="Microsoft.Extensions.Caching.Memory" />
<Reference Include="Microsoft.Extensions.FileProviders.Composite" /> <Reference Include="Microsoft.Extensions.FileProviders.Composite" />
<Reference Include="Microsoft.Extensions.FileProviders.Embedded" /> <Reference Include="Microsoft.Extensions.FileProviders.Embedded" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.Extensions.ValueStopwatch.Sources" PrivateAssets="All" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>

View File

@ -1,33 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.IO;
namespace Microsoft.AspNetCore.Components.Server
{
/// <summary>
/// Represents the result of a prerendering an <see cref="IComponent"/>.
/// </summary>
public sealed class ComponentPrerenderResult
{
private readonly IEnumerable<string> _result;
internal ComponentPrerenderResult(IEnumerable<string> result)
{
_result = result;
}
/// <summary>
/// Writes the prerendering result to the given <paramref name="writer"/>.
/// </summary>
/// <param name="writer">The <see cref="TextWriter"/> the results will be written to.</param>
public void WriteTo(TextWriter writer)
{
foreach (var element in _result)
{
writer.Write(element);
}
}
}
}

View File

@ -1,29 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Components.Server
{
/// <summary>
/// The context for prerendering a component.
/// </summary>
public class ComponentPrerenderingContext
{
/// <summary>
/// Gets or sets the component type.
/// </summary>
public Type ComponentType { get; set; }
/// <summary>
/// Gets or sets the parameters for the component.
/// </summary>
public ParameterView Parameters { get; set; }
/// <summary>
/// Gets or sets the <see cref="HttpContext"/> in which the prerendering has been initiated.
/// </summary>
public HttpContext Context { get; set; }
}
}

View File

@ -1,20 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Components.Server
{
/// <summary>
/// Prerrenders <see cref="IComponent"/> instances.
/// </summary>
public interface IComponentPrerenderer
{
/// <summary>
/// Prerrenders the component <see cref="ComponentPrerenderingContext.ComponentType"/>.
/// </summary>
/// <param name="context">The context in which the prerrendering is happening.</param>
/// <returns><see cref="Task{TResult}"/> that will complete when the prerendering is done.</returns>
Task<ComponentPrerenderResult> PrerenderComponentAsync(ComponentPrerenderingContext context);
}
}

View File

@ -1,253 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO;
using System.Security.Claims;
using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Server.Circuits;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Moq;
using Xunit;
namespace Microsoft.AspNetCore.Components.Server.Tests.Circuits
{
public class CircuitPrerendererTest
{
private static readonly Regex ContentWrapperRegex = new Regex(
"<!-- M.A.C.Component: {\"circuitId\":\"[^\"]+\",\"rendererId\":0,\"componentId\":0} -->(?<content>.*)<!-- M.A.C.Component: 0 -->",
RegexOptions.Compiled | RegexOptions.Singleline, TimeSpan.FromSeconds(1)); // Treat the entire input string as a single line
private static readonly Regex CircuitInfoRegex = new Regex(
"<!-- M.A.C.Component: (?<info>.*?) -->.*",
RegexOptions.Compiled | RegexOptions.Singleline, TimeSpan.FromSeconds(1)); // Treat the entire input string as a single line
// Because CircuitPrerenderer is a point of integration with HttpContext,
// it's not a good candidate for unit testing. The majority of prerendering
// unit tests should be elsewhere in HtmlRendererTests inside the
// Microsoft.AspNetCore.Components.Tests projects.
//
// The only unit tests added here should specifically be about how we're
// interacting with the HttpContext for configuring the prerenderer.
[Fact]
public async Task ExtractsUriFromHttpContext_EmptyPathBase()
{
// Arrange
var circuitFactory = new TestCircuitFactory();
var circuitRegistry = new CircuitRegistry(
Options.Create(new CircuitOptions()),
Mock.Of<ILogger<CircuitRegistry>>(),
TestCircuitIdFactory.CreateTestFactory());
var circuitPrerenderer = new CircuitPrerenderer(circuitFactory, circuitRegistry);
var httpContext = new DefaultHttpContext();
var httpRequest = httpContext.Request;
httpRequest.Scheme = "https";
httpRequest.Host = new HostString("example.com", 1234);
httpRequest.Path = "/some/path";
var prerenderingContext = new ComponentPrerenderingContext
{
ComponentType = typeof(UriDisplayComponent),
Parameters = ParameterView.Empty,
Context = httpContext
};
// Act
var result = await circuitPrerenderer.PrerenderComponentAsync(prerenderingContext);
// Assert
Assert.Equal(string.Join("", new[]
{
"The current URI is ",
"https://example.com:1234/some/path",
" within base URI ",
"https://example.com:1234/"
}), GetUnwrappedContent(result));
}
private string GetUnwrappedContent(ComponentPrerenderResult rawResult)
{
var writer = new StringWriter();
rawResult.WriteTo(writer);
return ContentWrapperRegex.Match(writer.ToString())
.Groups["content"].Value
.Replace("\r\n","\n");
}
private JsonDocument GetUnwrappedCircuitInfo(ComponentPrerenderResult rawResult)
{
var writer = new StringWriter();
rawResult.WriteTo(writer);
var circuitInfo = CircuitInfoRegex.Match(writer.ToString()).Groups["info"].Value;
return JsonDocument.Parse(circuitInfo);
}
[Fact]
public async Task ExtractsUriFromHttpContext_NonemptyPathBase()
{
// Arrange
var circuitFactory = new TestCircuitFactory();
var circuitRegistry = new CircuitRegistry(
Options.Create(new CircuitOptions()),
Mock.Of<ILogger<CircuitRegistry>>(),
TestCircuitIdFactory.CreateTestFactory());
var circuitPrerenderer = new CircuitPrerenderer(circuitFactory, circuitRegistry);
var httpContext = new DefaultHttpContext();
var httpRequest = httpContext.Request;
httpRequest.Scheme = "https";
httpRequest.Host = new HostString("example.com", 1234);
httpRequest.PathBase = "/my/dir";
httpRequest.Path = "/some/path";
var prerenderingContext = new ComponentPrerenderingContext
{
ComponentType = typeof(UriDisplayComponent),
Parameters = ParameterView.Empty,
Context = httpContext
};
// Act
var result = await circuitPrerenderer.PrerenderComponentAsync(prerenderingContext);
// Assert
Assert.Equal(string.Join("", new[]
{
"The current URI is ",
"https://example.com:1234/my/dir/some/path",
" within base URI ",
"https://example.com:1234/my/dir/"
}), GetUnwrappedContent(result));
}
[Fact]
public async Task ReplacesDashesWithDots_WhenTheyAppearInPairs()
{
// Arrange
var circuitFactory = new TestCircuitFactory(() => "--1234--");
var circuitRegistry = new CircuitRegistry(
Options.Create(new CircuitOptions()),
Mock.Of<ILogger<CircuitRegistry>>(),
TestCircuitIdFactory.CreateTestFactory());
var circuitPrerenderer = new CircuitPrerenderer(circuitFactory, circuitRegistry);
var httpContext = new DefaultHttpContext();
var httpRequest = httpContext.Request;
httpRequest.Scheme = "https";
httpRequest.Host = new HostString("example.com", 1234);
httpRequest.Path = "/some/path";
var prerenderingContext = new ComponentPrerenderingContext
{
ComponentType = typeof(UriDisplayComponent),
Parameters = ParameterView.Empty,
Context = httpContext
};
// Act
var result = await circuitPrerenderer.PrerenderComponentAsync(prerenderingContext);
// Assert
Assert.Equal("..1234..", GetUnwrappedCircuitInfo(result).RootElement.GetProperty("circuitId").GetString());
}
[Fact]
public async Task DisposesCircuitScopeEvenIfPrerenderingThrows()
{
// Arrange
var circuitFactory = new MockServiceScopeCircuitFactory();
var circuitRegistry = new CircuitRegistry(
Options.Create(new CircuitOptions()),
Mock.Of<ILogger<CircuitRegistry>>(),
TestCircuitIdFactory.CreateTestFactory());
var httpContext = new DefaultHttpContext();
var prerenderer = new CircuitPrerenderer(circuitFactory, circuitRegistry);
var prerenderingContext = new ComponentPrerenderingContext
{
ComponentType = typeof(ThrowExceptionComponent),
Parameters = ParameterView.Empty,
Context = httpContext
};
// Act
await Assert.ThrowsAsync<InvalidTimeZoneException>(async () =>
await prerenderer.PrerenderComponentAsync(prerenderingContext));
// Assert
circuitFactory.MockServiceScope.Verify(scope => scope.Dispose(), Times.Once());
}
class TestCircuitFactory : CircuitFactory
{
private readonly Func<string> _circuitIdFactory;
public TestCircuitFactory(Func<string> circuitIdFactory = null)
{
_circuitIdFactory = circuitIdFactory ?? (() => Guid.NewGuid().ToString());
}
public override CircuitHost CreateCircuitHost(HttpContext httpContext, CircuitClientProxy client, string uriAbsolute, string baseUriAbsolute, ClaimsPrincipal user)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddScoped<IUriHelper>(_ =>
{
var uriHelper = new RemoteUriHelper(NullLogger<RemoteUriHelper>.Instance);
uriHelper.InitializeState(uriAbsolute, baseUriAbsolute);
return uriHelper;
});
var serviceScope = serviceCollection.BuildServiceProvider().CreateScope();
return TestCircuitHost.Create(_circuitIdFactory(), serviceScope);
}
}
class MockServiceScopeCircuitFactory : CircuitFactory
{
public Mock<IServiceScope> MockServiceScope { get; }
= new Mock<IServiceScope>();
public override CircuitHost CreateCircuitHost(HttpContext httpContext, CircuitClientProxy client, string uriAbsolute, string baseUriAbsolute, ClaimsPrincipal user)
{
return TestCircuitHost.Create(Guid.NewGuid().ToString(), MockServiceScope.Object);
}
}
class UriDisplayComponent : IComponent
{
private RenderHandle _renderHandle;
[Inject] IUriHelper UriHelper { get; set; }
public void Attach(RenderHandle renderHandle)
{
_renderHandle = renderHandle;
}
public Task SetParametersAsync(ParameterView parameters)
{
_renderHandle.Render(builder =>
{
builder.AddContent(0, "The current URI is ");
builder.AddContent(1, UriHelper.GetAbsoluteUri());
builder.AddContent(2, " within base URI ");
builder.AddContent(3, UriHelper.GetBaseUri());
});
return Task.CompletedTask;
}
}
class ThrowExceptionComponent : IComponent
{
public void Attach(RenderHandle renderHandle)
=> throw new InvalidTimeZoneException();
public Task SetParametersAsync(ParameterView parameters)
=> Task.CompletedTask;
}
}
}

View File

@ -11,7 +11,6 @@ using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Moq; using Moq;
@ -19,7 +18,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits
{ {
internal class TestCircuitHost : CircuitHost internal class TestCircuitHost : CircuitHost
{ {
private TestCircuitHost(string circuitId, IServiceScope scope, CircuitClientProxy client, RendererRegistry rendererRegistry, RemoteRenderer renderer, IList<ComponentDescriptor> descriptors, RemoteJSRuntime jsRuntime, CircuitHandler[] circuitHandlers, ILogger logger) private TestCircuitHost(string circuitId, IServiceScope scope, CircuitClientProxy client, RendererRegistry rendererRegistry, RemoteRenderer renderer, IReadOnlyList<ComponentDescriptor> descriptors, RemoteJSRuntime jsRuntime, CircuitHandler[] circuitHandlers, ILogger logger)
: base(circuitId, scope, client, rendererRegistry, renderer, descriptors, jsRuntime, circuitHandlers, logger) : base(circuitId, scope, client, rendererRegistry, renderer, descriptors, jsRuntime, circuitHandlers, logger)
{ {
} }

View File

@ -2,8 +2,8 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Diagnostics; using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Moq; using Moq;
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Components.Server.Tests
.UseRouting() .UseRouting()
.UseEndpoints(endpoints => .UseEndpoints(endpoints =>
{ {
endpoints.MapBlazorHub(dispatchOptions => called = true); endpoints.MapBlazorHub<MyComponent>("app", dispatchOptions => called = true);
}).Build(); }).Build();
// Assert // Assert
@ -68,5 +68,18 @@ namespace Microsoft.AspNetCore.Components.Server.Tests
return new ApplicationBuilder(serviceProvder); return new ApplicationBuilder(serviceProvder);
} }
private class MyComponent : IComponent
{
public void Attach(RenderHandle renderHandle)
{
throw new System.NotImplementedException();
}
public Task SetParametersAsync(ParameterView parameters)
{
throw new System.NotImplementedException();
}
}
} }
} }

View File

@ -55,7 +55,7 @@ namespace Microsoft.AspNetCore.Components.Test.Helpers
Assert.Equal(attributeValue, frame.AttributeValue); Assert.Equal(attributeValue, frame.AttributeValue);
} }
public static void Attribute(RenderTreeFrame frame, string attributeName, Action<UIEventArgs> attributeEventHandlerValue, int? sequence = null) public static void Attribute(RenderTreeFrame frame, string attributeName, Action<EventArgs> attributeEventHandlerValue, int? sequence = null)
{ {
AssertFrame.Attribute(frame, attributeName, sequence); AssertFrame.Attribute(frame, attributeName, sequence);
Assert.Equal(attributeEventHandlerValue, frame.AttributeValue); Assert.Equal(attributeEventHandlerValue, frame.AttributeValue);

View File

@ -60,10 +60,10 @@ namespace Microsoft.AspNetCore.Components.Test.Helpers
public new Task RenderRootComponentAsync(int componentId, ParameterView parameters) public new Task RenderRootComponentAsync(int componentId, ParameterView parameters)
=> Dispatcher.InvokeAsync(() => base.RenderRootComponentAsync(componentId, parameters)); => Dispatcher.InvokeAsync(() => base.RenderRootComponentAsync(componentId, parameters));
public Task DispatchEventAsync(ulong eventHandlerId, UIEventArgs args) public Task DispatchEventAsync(ulong eventHandlerId, EventArgs args)
=> Dispatcher.InvokeAsync(() => base.DispatchEventAsync(eventHandlerId, null, args)); => Dispatcher.InvokeAsync(() => base.DispatchEventAsync(eventHandlerId, null, args));
public new Task DispatchEventAsync(ulong eventHandlerId, EventFieldInfo eventFieldInfo, UIEventArgs args) public new Task DispatchEventAsync(ulong eventHandlerId, EventFieldInfo eventFieldInfo, EventArgs args)
=> Dispatcher.InvokeAsync(() => base.DispatchEventAsync(eventHandlerId, eventFieldInfo, args)); => Dispatcher.InvokeAsync(() => base.DispatchEventAsync(eventHandlerId, eventFieldInfo, args));
private static Task UnwrapTask(Task task) private static Task UnwrapTask(Task task)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -6,7 +6,7 @@ import { shouldAutoStart } from './BootCommon';
import { RenderQueue } from './Platform/Circuits/RenderQueue'; import { RenderQueue } from './Platform/Circuits/RenderQueue';
import { ConsoleLogger } from './Platform/Logging/Loggers'; import { ConsoleLogger } from './Platform/Logging/Loggers';
import { LogLevel, Logger } from './Platform/Logging/Logger'; import { LogLevel, Logger } from './Platform/Logging/Logger';
import { discoverPrerenderedCircuits, startCircuit } from './Platform/Circuits/CircuitManager'; import { startCircuit } from './Platform/Circuits/CircuitManager';
import { setEventDispatcher } from './Rendering/RendererEventDispatcher'; import { setEventDispatcher } from './Rendering/RendererEventDispatcher';
import { resolveOptions, BlazorOptions } from './Platform/Circuits/BlazorOptions'; import { resolveOptions, BlazorOptions } from './Platform/Circuits/BlazorOptions';
import { DefaultReconnectionHandler } from './Platform/Circuits/DefaultReconnectionHandler'; import { DefaultReconnectionHandler } from './Platform/Circuits/DefaultReconnectionHandler';
@ -27,32 +27,18 @@ async function boot(userOptions?: Partial<BlazorOptions>): Promise<void> {
options.reconnectionHandler = options.reconnectionHandler || window['Blazor'].defaultReconnectionHandler; options.reconnectionHandler = options.reconnectionHandler || window['Blazor'].defaultReconnectionHandler;
logger.log(LogLevel.Information, 'Starting up blazor server-side application.'); logger.log(LogLevel.Information, 'Starting up blazor server-side application.');
// Initialize statefully prerendered circuits and their components
// Note: This will all be removed soon
const initialConnection = await initializeConnection(options, logger); const initialConnection = await initializeConnection(options, logger);
const circuits = discoverPrerenderedCircuits(document);
for (let i = 0; i < circuits.length; i++) {
const circuit = circuits[i];
for (let j = 0; j < circuit.components.length; j++) {
const component = circuit.components[j];
component.initialize();
}
}
const circuit = await startCircuit(initialConnection); const circuit = await startCircuit(initialConnection);
if (!circuit) {
logger.log(LogLevel.Information, 'No preregistered components to render.');
}
const reconnect = async (existingConnection?: signalR.HubConnection): Promise<boolean> => { const reconnect = async (existingConnection?: signalR.HubConnection): Promise<boolean> => {
if (renderingFailed) { if (renderingFailed) {
// We can't reconnect after a failure, so exit early. // We can't reconnect after a failure, so exit early.
return false; return false;
} }
const reconnection = existingConnection || await initializeConnection(options, logger);
const results = await Promise.all(circuits.map(circuit => circuit.reconnect(reconnection)));
if (reconnectionFailed(results)) { const reconnection = existingConnection || await initializeConnection(options, logger);
if (!(await circuit.reconnect(reconnection))) {
logger.log(LogLevel.Information, 'Reconnection attempt failed.');
return false; return false;
} }
@ -63,19 +49,7 @@ async function boot(userOptions?: Partial<BlazorOptions>): Promise<void> {
window['Blazor'].reconnect = reconnect; window['Blazor'].reconnect = reconnect;
const reconnectTask = reconnect(initialConnection);
if (circuit) {
circuits.push(circuit);
}
await reconnectTask;
logger.log(LogLevel.Information, 'Blazor server-side application started.'); logger.log(LogLevel.Information, 'Blazor server-side application started.');
function reconnectionFailed(results: boolean[]): boolean {
return !results.reduce((current, next) => current && next, true);
}
} }
async function initializeConnection(options: BlazorOptions, logger: Logger): Promise<signalR.HubConnection> { async function initializeConnection(options: BlazorOptions, logger: Logger): Promise<signalR.HubConnection> {
@ -94,6 +68,11 @@ async function initializeConnection(options: BlazorOptions, logger: Logger): Pro
return connection.send('DispatchBrowserEvent', JSON.stringify(descriptor), JSON.stringify(args)); return connection.send('DispatchBrowserEvent', JSON.stringify(descriptor), JSON.stringify(args));
}); });
// Configure navigation via SignalR
window['Blazor']._internal.navigationManager.listenForNavigationEvents((uri: string, intercepted: boolean): Promise<void> => {
return connection.send('OnLocationChanged', uri, intercepted);
});
connection.on('JS.BeginInvokeJS', DotNet.jsCallDispatcher.beginInvokeJSFromDotNet); connection.on('JS.BeginInvokeJS', DotNet.jsCallDispatcher.beginInvokeJSFromDotNet);
connection.on('JS.EndInvokeDotNet', (args: string) => DotNet.jsCallDispatcher.endInvokeDotNetFromJS(...(JSON.parse(args) as [string, boolean, unknown]))); connection.on('JS.EndInvokeDotNet', (args: string) => DotNet.jsCallDispatcher.endInvokeDotNetFromJS(...(JSON.parse(args) as [string, boolean, unknown])));
connection.on('JS.RenderBatch', (browserRendererId: number, batchId: number, batchData: Uint8Array) => { connection.on('JS.RenderBatch', (browserRendererId: number, batchId: number, batchData: Uint8Array) => {

View File

@ -27,6 +27,16 @@ async function boot(options?: any): Promise<void> {
renderBatch(browserRendererId, new SharedMemoryRenderBatch(batchAddress)); renderBatch(browserRendererId, new SharedMemoryRenderBatch(batchAddress));
}; };
// Configure navigation via JS Interop
window['Blazor']._internal.navigationManager.listenForNavigationEvents(async (uri: string, intercepted: boolean): Promise<void> => {
await DotNet.invokeMethodAsync(
'Microsoft.AspNetCore.Blazor',
'NotifyLocationChanged',
uri,
intercepted
);
});
// Fetch the boot JSON file // Fetch the boot JSON file
const bootConfig = await fetchBootConfigAsync(); const bootConfig = await fetchBootConfigAsync();
const embeddedResourcesPromise = loadEmbeddedResourcesAsync(bootConfig); const embeddedResourcesPromise = loadEmbeddedResourcesAsync(bootConfig);

View File

@ -1,4 +1,4 @@
import { navigateTo, internalFunctions as uriHelperInternalFunctions } from './Services/UriHelper'; import { navigateTo, internalFunctions as navigationManagerInternalFunctions } from './Services/NavigationManager';
import { internalFunctions as httpInternalFunctions } from './Services/Http'; import { internalFunctions as httpInternalFunctions } from './Services/Http';
import { attachRootComponentToElement } from './Rendering/Renderer'; import { attachRootComponentToElement } from './Rendering/Renderer';
@ -9,6 +9,6 @@ window['Blazor'] = {
_internal: { _internal: {
attachRootComponentToElement, attachRootComponentToElement,
http: httpInternalFunctions, http: httpInternalFunctions,
uriHelper: uriHelperInternalFunctions, navigationManager: navigationManagerInternalFunctions,
}, },
}; };

View File

@ -1,14 +1,10 @@
import { internalFunctions as uriHelperFunctions } from '../../Services/UriHelper'; import { internalFunctions as navigationManagerFunctions } from '../../Services/NavigationManager';
import { ComponentDescriptor, MarkupRegistrationTags, StartComponentComment, EndComponentComment } from './ComponentDescriptor';
export class CircuitDescriptor { export class CircuitDescriptor {
public circuitId: string; public circuitId: string;
public components: ComponentDescriptor[]; public constructor(circuitId: string) {
public constructor(circuitId: string, components: ComponentDescriptor[]) {
this.circuitId = circuitId; this.circuitId = circuitId;
this.components = components;
} }
public reconnect(reconnection: signalR.HubConnection): Promise<boolean> { public reconnect(reconnection: signalR.HubConnection): Promise<boolean> {
@ -16,115 +12,11 @@ export class CircuitDescriptor {
} }
} }
export async function startCircuit(connection: signalR.HubConnection): Promise<CircuitDescriptor> {
export function discoverPrerenderedCircuits(document: Document): CircuitDescriptor[] { const result = await connection.invoke<string>('StartCircuit', navigationManagerFunctions.getBaseURI(), navigationManagerFunctions.getLocationHref());
const commentPairs = resolveCommentPairs(document);
const discoveredCircuits = new Map<string, ComponentDescriptor[]>();
for (let i = 0; i < commentPairs.length; i++) {
const pair = commentPairs[i];
// We replace '--' on the server with '..' when we prerender due to the fact that this
// is not allowed in HTML comments and doesn't get encoded by default.
const circuitId = pair.start.circuitId.replace('..', '--');
let circuit = discoveredCircuits.get(circuitId);
if (!circuit) {
circuit = [];
discoveredCircuits.set(circuitId, circuit);
}
const entry = new ComponentDescriptor(pair.start.componentId, circuitId, pair.start.rendererId, pair);
circuit.push(entry);
}
const circuits: CircuitDescriptor[] = [];
for (const [key, values] of discoveredCircuits) {
circuits.push(new CircuitDescriptor(key, values));
}
return circuits;
}
export async function startCircuit(connection: signalR.HubConnection): Promise<CircuitDescriptor | undefined> {
const result = await connection.invoke<string>('StartCircuit', uriHelperFunctions.getLocationHref(), uriHelperFunctions.getBaseURI());
if (result) { if (result) {
return new CircuitDescriptor(result, []); return new CircuitDescriptor(result);
} else { } else {
return undefined; throw new Error('Circuit failed to start');
} }
} }
function resolveCommentPairs(node: Node): MarkupRegistrationTags[] {
if (!node.hasChildNodes()) {
return [];
}
const result: MarkupRegistrationTags[] = [];
const children = node.childNodes;
let i = 0;
const childrenLength = children.length;
while (i < childrenLength) {
const currentChildNode = children[i];
const startComponent = getComponentStartComment(currentChildNode);
if (!startComponent) {
i++;
const childResults = resolveCommentPairs(currentChildNode);
for (let j = 0; j < childResults.length; j++) {
const childResult = childResults[j];
result.push(childResult);
}
continue;
}
const endComponent = getComponentEndComment(startComponent, children, i + 1, childrenLength);
result.push({ start: startComponent, end: endComponent });
i = endComponent.index + 1;
}
return result;
}
function getComponentStartComment(node: Node): StartComponentComment | undefined {
if (node.nodeType !== Node.COMMENT_NODE) {
return;
}
if (node.textContent) {
const componentStartComment = /\W+M.A.C.Component:[^{]*(.*)$/;
const definition = componentStartComment.exec(node.textContent);
const json = definition && definition[1];
if (json) {
try {
const { componentId, rendererId, circuitId } = JSON.parse(json);
const allComponents = componentId !== undefined && rendererId !== undefined && !!circuitId;
if (allComponents) {
return {
node: node as Comment,
circuitId,
rendererId: rendererId,
componentId: componentId,
};
}
} catch (error) {
}
throw new Error(`Found malformed start component comment at ${node.textContent}`);
}
}
}
function getComponentEndComment(component: StartComponentComment, children: NodeList, index: number, end: number): EndComponentComment {
for (let i = index; i < end; i++) {
const node = children[i];
if (node.nodeType !== Node.COMMENT_NODE) {
continue;
}
if (!node.textContent) {
continue;
}
const componentEndComment = /\W+M.A.C.Component:\W+(\d+)\W+$/;
const definition = componentEndComment.exec(node.textContent);
const json = definition && definition[1];
if (!json) {
continue;
}
try {
// The value is expected to be a JSON encoded number
const componentId = JSON.parse(json);
if (componentId === component.componentId) {
return { componentId, node: node as Comment, index: i };
}
} catch (error) {
}
throw new Error(`Found malformed end component comment at ${node.textContent}`);
}
throw new Error(`End component comment not found for ${component.node}`);
}

View File

@ -1,46 +0,0 @@
import { attachRootComponentToLogicalElement } from '../../Rendering/Renderer';
import { toLogicalRootCommentElement } from '../../Rendering/LogicalElements';
export interface EndComponentComment {
componentId: number;
node: Comment;
index: number;
}
export interface StartComponentComment {
node: Comment;
rendererId: number;
componentId: number;
circuitId: string;
}
// Represent pairs of start end comments indicating a component that was registered
// in markup (such as a prerendered component)
export interface MarkupRegistrationTags {
start: StartComponentComment;
end: EndComponentComment;
}
export class ComponentDescriptor {
public registrationTags: MarkupRegistrationTags;
public componentId: number;
public circuitId: string;
public rendererId: number;
public constructor(componentId: number, circuitId: string, rendererId: number, descriptor: MarkupRegistrationTags) {
this.componentId = componentId;
this.circuitId = circuitId;
this.rendererId = rendererId;
this.registrationTags = descriptor;
}
public initialize(): void {
const startEndPair = { start: this.registrationTags.start.node, end: this.registrationTags.end.node };
const logicalElement = toLogicalRootCommentElement(startEndPair.start, startEndPair.end);
attachRootComponentToLogicalElement(this.rendererId, logicalElement, this.componentId);
}
}

View File

@ -5,7 +5,7 @@ let hasRegisteredNavigationInterception = false;
let hasRegisteredNavigationEventListeners = false; let hasRegisteredNavigationEventListeners = false;
// Will be initialized once someone registers // Will be initialized once someone registers
let notifyLocationChangedCallback: { assemblyName: string; functionName: string } | null = null; let notifyLocationChangedCallback: ((uri: string, intercepted: boolean) => Promise<void>) | null = null;
// These are the functions we're making available for invocation from .NET // These are the functions we're making available for invocation from .NET
export const internalFunctions = { export const internalFunctions = {
@ -16,12 +16,12 @@ export const internalFunctions = {
getLocationHref: () => location.href, getLocationHref: () => location.href,
}; };
function listenForNavigationEvents(assemblyName: string, functionName: string) { function listenForNavigationEvents(callback: (uri: string, intercepted: boolean) => Promise<void>) {
if (hasRegisteredNavigationEventListeners) { if (hasRegisteredNavigationEventListeners) {
return; return;
} }
notifyLocationChangedCallback = { assemblyName, functionName }; notifyLocationChangedCallback = callback;
hasRegisteredNavigationEventListeners = true; hasRegisteredNavigationEventListeners = true;
window.addEventListener('popstate', () => notifyLocationChanged(false)); window.addEventListener('popstate', () => notifyLocationChanged(false));
@ -95,12 +95,7 @@ function performInternalNavigation(absoluteInternalHref: string, interceptedLink
async function notifyLocationChanged(interceptedLink: boolean) { async function notifyLocationChanged(interceptedLink: boolean) {
if (notifyLocationChangedCallback) { if (notifyLocationChangedCallback) {
await DotNet.invokeMethodAsync( await notifyLocationChangedCallback(location.href, interceptedLink);
notifyLocationChangedCallback.assemblyName,
notifyLocationChangedCallback.functionName,
location.href,
interceptedLink
);
} }
} }

View File

@ -1,146 +0,0 @@
(global as any).DotNet = { attachReviver: jest.fn() };
import { discoverPrerenderedCircuits } from '../src/Platform/Circuits/CircuitManager';
import { JSDOM } from 'jsdom';
describe('CircuitManager', () => {
it('discoverPrerenderedCircuits returns discovered prerendered circuits', () => {
const dom = new JSDOM(`<!doctype HTML>
<html>
<head>
<title>Page</title>
</head>
<body>
<header>Preamble</header>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":1} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 1 -->
<footer></footer>
</body>
</html>`);
const results = discoverPrerenderedCircuits(dom.window.document);
expect(results.length).toEqual(1);
expect(results[0].components.length).toEqual(1);
const result = results[0].components[0];
expect(result.circuitId).toEqual("1234");
expect(result.rendererId).toEqual(2);
expect(result.componentId).toEqual(1);
});
it('discoverPrerenderedCircuits returns discovers multiple prerendered circuits', () => {
const dom = new JSDOM(`<!doctype HTML>
<html>
<head>
<title>Page</title>
</head>
<body>
<header>Preamble</header>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":1} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 1 -->
<footer>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":2} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 2 -->
</footer>
</body>
</html>`);
const results = discoverPrerenderedCircuits(dom.window.document);
expect(results.length).toEqual(1);
expect(results[0].components.length).toEqual(2);
const first = results[0].components[0];
expect(first.circuitId).toEqual("1234");
expect(first.rendererId).toEqual(2);
expect(first.componentId).toEqual(1);
const second = results[0].components[1];
expect(second.circuitId).toEqual("1234");
expect(second.rendererId).toEqual(2);
expect(second.componentId).toEqual(2);
});
it('discoverPrerenderedCircuits throws for malformed circuits - improper nesting', () => {
const dom = new JSDOM(`<!doctype HTML>
<html>
<head>
<title>Page</title>
</head>
<body>
<header>Preamble</header>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":1} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 2 -->
<footer>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":2} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 1 -->
</footer>
</body>
</html>`);
expect(() => discoverPrerenderedCircuits(dom.window.document))
.toThrow();
});
it('discoverPrerenderedCircuits throws for malformed circuits - mixed string and int', () => {
const dom = new JSDOM(`<!doctype HTML>
<html>
<head>
<title>Page</title>
</head>
<body>
<header>Preamble</header>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":"2","componentId":"1"} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 1 -->
<footer>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":2} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 2 -->
</footer>
</body>
</html>`);
expect(() => discoverPrerenderedCircuits(dom.window.document))
.toThrow();
});
it('discoverPrerenderedCircuits initializes circuits', () => {
const dom = new JSDOM(`<!doctype HTML>
<html>
<head>
<title>Page</title>
</head>
<body>
<header>Preamble</header>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":1} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 1 -->
<footer>
<!-- M.A.C.Component: {"circuitId":"1234","rendererId":2,"componentId":2} -->
<p>Prerendered content</p>
<!-- M.A.C.Component: 2 -->
</footer>
</body>
</html>`);
const results = discoverPrerenderedCircuits(dom.window.document);
for (let i = 0; i < results.length; i++) {
const result = results[i];
for (let j = 0; j < result.components.length; j++) {
const component = result.components[j];
component.initialize();
}
}
});
});

View File

@ -6,7 +6,9 @@ namespace Microsoft.AspNetCore.Components
[Microsoft.AspNetCore.Components.BindElementAttribute("select", null, "value", "onchange")] [Microsoft.AspNetCore.Components.BindElementAttribute("select", null, "value", "onchange")]
[Microsoft.AspNetCore.Components.BindElementAttribute("textarea", null, "value", "onchange")] [Microsoft.AspNetCore.Components.BindElementAttribute("textarea", null, "value", "onchange")]
[Microsoft.AspNetCore.Components.BindInputElementAttribute("checkbox", null, "checked", "onchange", false, null)] [Microsoft.AspNetCore.Components.BindInputElementAttribute("checkbox", null, "checked", "onchange", false, null)]
[Microsoft.AspNetCore.Components.BindInputElementAttribute("date", "value", "value", "onchange", true, "yyyy-MM-dd")]
[Microsoft.AspNetCore.Components.BindInputElementAttribute("date", null, "value", "onchange", true, "yyyy-MM-dd")] [Microsoft.AspNetCore.Components.BindInputElementAttribute("date", null, "value", "onchange", true, "yyyy-MM-dd")]
[Microsoft.AspNetCore.Components.BindInputElementAttribute("number", "value", "value", "onchange", true, null)]
[Microsoft.AspNetCore.Components.BindInputElementAttribute("number", null, "value", "onchange", true, null)] [Microsoft.AspNetCore.Components.BindInputElementAttribute("number", null, "value", "onchange", true, null)]
[Microsoft.AspNetCore.Components.BindInputElementAttribute("text", null, "value", "onchange", false, null)] [Microsoft.AspNetCore.Components.BindInputElementAttribute("text", null, "value", "onchange", false, null)]
[Microsoft.AspNetCore.Components.BindInputElementAttribute(null, "value", "value", "onchange", false, null)] [Microsoft.AspNetCore.Components.BindInputElementAttribute(null, "value", "value", "onchange", false, null)]
@ -51,23 +53,23 @@ namespace Microsoft.AspNetCore.Components
public System.Type EventArgsType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public System.Type EventArgsType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
} }
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onabort", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onabort", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onactivate", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onactivate", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforeactivate", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforeactivate", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecopy", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecopy", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecut", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforecut", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforedeactivate", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforedeactivate", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforepaste", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onbeforepaste", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onblur", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onblur", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplay", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplay", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplaythrough", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncanplaythrough", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onchange", typeof(Microsoft.AspNetCore.Components.UIChangeEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onchange", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onclick", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onclick", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oncontextmenu", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncontextmenu", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oncopy", typeof(Microsoft.AspNetCore.Components.UIClipboardEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncopy", typeof(Microsoft.AspNetCore.Components.UIClipboardEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oncuechange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncuechange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oncut", typeof(Microsoft.AspNetCore.Components.UIClipboardEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oncut", typeof(Microsoft.AspNetCore.Components.UIClipboardEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondblclick", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondblclick", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondeactivate", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondeactivate", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrag", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrag", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragend", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragend", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragenter", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragenter", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))]
@ -75,24 +77,24 @@ namespace Microsoft.AspNetCore.Components
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragover", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragover", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragstart", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondragstart", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrop", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondrop", typeof(Microsoft.AspNetCore.Components.UIDragEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ondurationchange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ondurationchange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onemptied", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onemptied", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onended", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onended", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onerror", typeof(Microsoft.AspNetCore.Components.UIErrorEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onerror", typeof(Microsoft.AspNetCore.Components.UIErrorEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocus", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocus", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusin", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusin", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusout", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfocusout", typeof(Microsoft.AspNetCore.Components.UIFocusEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenchange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenchange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenerror", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onfullscreenerror", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ongotpointercapture", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ongotpointercapture", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oninput", typeof(Microsoft.AspNetCore.Components.UIChangeEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninput", typeof(Microsoft.AspNetCore.Components.ChangeEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("oninvalid", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("oninvalid", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeydown", typeof(Microsoft.AspNetCore.Components.UIKeyboardEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeydown", typeof(Microsoft.AspNetCore.Components.UIKeyboardEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeypress", typeof(Microsoft.AspNetCore.Components.UIKeyboardEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeypress", typeof(Microsoft.AspNetCore.Components.UIKeyboardEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeyup", typeof(Microsoft.AspNetCore.Components.UIKeyboardEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onkeyup", typeof(Microsoft.AspNetCore.Components.UIKeyboardEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onload", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onload", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadeddata", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadeddata", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadedmetadata", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadedmetadata", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadend", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadend", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadstart", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onloadstart", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onlostpointercapture", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onlostpointercapture", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
@ -103,50 +105,51 @@ namespace Microsoft.AspNetCore.Components
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseup", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmouseup", typeof(Microsoft.AspNetCore.Components.UIMouseEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousewheel", typeof(Microsoft.AspNetCore.Components.UIWheelEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onmousewheel", typeof(Microsoft.AspNetCore.Components.UIWheelEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpaste", typeof(Microsoft.AspNetCore.Components.UIClipboardEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpaste", typeof(Microsoft.AspNetCore.Components.UIClipboardEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpause", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpause", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onplay", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplay", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onplaying", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onplaying", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointercancel", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointercancel", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerdown", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerdown", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerenter", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerenter", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerleave", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerleave", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockchange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockchange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockerror", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerlockerror", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointermove", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointermove", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerout", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerout", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerover", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerover", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerup", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onpointerup", typeof(Microsoft.AspNetCore.Components.UIPointerEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onprogress", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onprogress", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onratechange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onratechange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onreadystatechange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreadystatechange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onreset", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onreset", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onscroll", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onscroll", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeked", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeked", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeking", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onseeking", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onselect", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselect", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectionchange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectionchange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectstart", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onselectstart", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onstalled", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstalled", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onstop", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onstop", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onsubmit", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsubmit", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onsuspend", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onsuspend", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeout", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeout", typeof(Microsoft.AspNetCore.Components.UIProgressEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeupdate", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontimeupdate", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchcancel", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchcancel", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchend", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchend", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchenter", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchenter", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchleave", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchleave", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchmove", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchmove", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchstart", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("ontouchstart", typeof(Microsoft.AspNetCore.Components.UITouchEventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onvolumechange", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onvolumechange", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onwaiting", typeof(Microsoft.AspNetCore.Components.UIEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwaiting", typeof(System.EventArgs))]
[Microsoft.AspNetCore.Components.EventHandlerAttribute("onwheel", typeof(Microsoft.AspNetCore.Components.UIWheelEventArgs))] [Microsoft.AspNetCore.Components.EventHandlerAttribute("onwheel", typeof(Microsoft.AspNetCore.Components.UIWheelEventArgs))]
public static partial class EventHandlers public static partial class EventHandlers
{ {
} }
public partial class UIClipboardEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UIClipboardEventArgs : System.EventArgs
{ {
public UIClipboardEventArgs() { } public UIClipboardEventArgs() { }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIDataTransferItem public partial class UIDataTransferItem
{ {
@ -159,19 +162,21 @@ namespace Microsoft.AspNetCore.Components
public UIDragEventArgs() { } public UIDragEventArgs() { }
public Microsoft.AspNetCore.Components.DataTransfer DataTransfer { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.DataTransfer DataTransfer { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIErrorEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UIErrorEventArgs : System.EventArgs
{ {
public UIErrorEventArgs() { } public UIErrorEventArgs() { }
public int Colno { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public int Colno { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Filename { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string Filename { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public int Lineno { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public int Lineno { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Message { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public string Message { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIFocusEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UIFocusEventArgs : System.EventArgs
{ {
public UIFocusEventArgs() { } public UIFocusEventArgs() { }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIKeyboardEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UIKeyboardEventArgs : System.EventArgs
{ {
public UIKeyboardEventArgs() { } public UIKeyboardEventArgs() { }
public bool AltKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool AltKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -182,8 +187,9 @@ namespace Microsoft.AspNetCore.Components
public bool MetaKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool MetaKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public bool Repeat { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool Repeat { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public bool ShiftKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool ShiftKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIMouseEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UIMouseEventArgs : System.EventArgs
{ {
public UIMouseEventArgs() { } public UIMouseEventArgs() { }
public bool AltKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool AltKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -197,6 +203,7 @@ namespace Microsoft.AspNetCore.Components
public double ScreenX { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public double ScreenX { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public double ScreenY { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public double ScreenY { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public bool ShiftKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool ShiftKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIPointerEventArgs : Microsoft.AspNetCore.Components.UIMouseEventArgs public partial class UIPointerEventArgs : Microsoft.AspNetCore.Components.UIMouseEventArgs
{ {
@ -210,14 +217,15 @@ namespace Microsoft.AspNetCore.Components
public float TiltY { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public float TiltY { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public float Width { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public float Width { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UIProgressEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UIProgressEventArgs : System.EventArgs
{ {
public UIProgressEventArgs() { } public UIProgressEventArgs() { }
public bool LengthComputable { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool LengthComputable { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public long Loaded { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public long Loaded { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public long Total { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public long Total { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UITouchEventArgs : Microsoft.AspNetCore.Components.UIEventArgs public partial class UITouchEventArgs : System.EventArgs
{ {
public UITouchEventArgs() { } public UITouchEventArgs() { }
public bool AltKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool AltKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -228,6 +236,7 @@ namespace Microsoft.AspNetCore.Components
public bool ShiftKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public bool ShiftKey { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Components.UITouchPoint[] TargetTouches { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.UITouchPoint[] TargetTouches { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public Microsoft.AspNetCore.Components.UITouchPoint[] Touches { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public Microsoft.AspNetCore.Components.UITouchPoint[] Touches { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
public string Type { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
} }
public partial class UITouchPoint public partial class UITouchPoint
{ {
@ -276,8 +285,8 @@ namespace Microsoft.AspNetCore.Components.Forms
{ {
public static partial class EditContextFieldClassExtensions public static partial class EditContextFieldClassExtensions
{ {
public static string FieldClass(this Microsoft.AspNetCore.Components.Forms.EditContext editContext, in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; } public static string FieldCssClass(this Microsoft.AspNetCore.Components.Forms.EditContext editContext, in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) { throw null; }
public static string FieldClass<TField>(this Microsoft.AspNetCore.Components.Forms.EditContext editContext, System.Linq.Expressions.Expression<System.Func<TField>> accessor) { throw null; } public static string FieldCssClass<TField>(this Microsoft.AspNetCore.Components.Forms.EditContext editContext, System.Linq.Expressions.Expression<System.Func<TField>> accessor) { throw null; }
} }
public partial class EditForm : Microsoft.AspNetCore.Components.ComponentBase public partial class EditForm : Microsoft.AspNetCore.Components.ComponentBase
{ {
@ -308,7 +317,6 @@ namespace Microsoft.AspNetCore.Components.Forms
protected T CurrentValue { get { throw null; } set { } } protected T CurrentValue { get { throw null; } set { } }
protected string CurrentValueAsString { get { throw null; } set { } } protected string CurrentValueAsString { get { throw null; } set { } }
protected Microsoft.AspNetCore.Components.Forms.EditContext EditContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } protected Microsoft.AspNetCore.Components.Forms.EditContext EditContext { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
protected string FieldClass { get { throw null; } }
protected Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } protected Microsoft.AspNetCore.Components.Forms.FieldIdentifier FieldIdentifier { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public T Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public T Value { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
@ -372,6 +380,7 @@ namespace Microsoft.AspNetCore.Components.Forms
[Microsoft.AspNetCore.Components.ParameterAttribute] [Microsoft.AspNetCore.Components.ParameterAttribute]
public System.Linq.Expressions.Expression<System.Func<T>> For { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.Linq.Expressions.Expression<System.Func<T>> For { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder builder) { } protected override void BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder builder) { }
protected virtual void Dispose(bool disposing) { }
protected override void OnParametersSet() { } protected override void OnParametersSet() { }
void System.IDisposable.Dispose() { } void System.IDisposable.Dispose() { }
} }
@ -381,6 +390,7 @@ namespace Microsoft.AspNetCore.Components.Forms
[Microsoft.AspNetCore.Components.ParameterAttribute(CaptureUnmatchedValues=true)] [Microsoft.AspNetCore.Components.ParameterAttribute(CaptureUnmatchedValues=true)]
public System.Collections.Generic.IReadOnlyDictionary<string, object> AdditionalAttributes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } } public System.Collections.Generic.IReadOnlyDictionary<string, object> AdditionalAttributes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
protected override void BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder builder) { } protected override void BuildRenderTree(Microsoft.AspNetCore.Components.RenderTree.RenderTreeBuilder builder) { }
protected virtual void Dispose(bool disposing) { }
protected override void OnParametersSet() { } protected override void OnParametersSet() { }
void System.IDisposable.Dispose() { } void System.IDisposable.Dispose() { }
} }

View File

@ -24,9 +24,11 @@ namespace Microsoft.AspNetCore.Components
// type="number" is invariant culture // type="number" is invariant culture
[BindInputElement("number", null, "value", "onchange", isInvariantCulture: true, format: null)] [BindInputElement("number", null, "value", "onchange", isInvariantCulture: true, format: null)]
[BindInputElement("number", "value", "value", "onchange", isInvariantCulture: true, format: null)]
// type="date" is invariant culture with a specific format // type="date" is invariant culture with a specific format
[BindInputElement("date", null, "value", "onchange", isInvariantCulture: true, format: "yyyy-MM-dd")] [BindInputElement("date", null, "value", "onchange", isInvariantCulture: true, format: "yyyy-MM-dd")]
[BindInputElement("date", "value", "value", "onchange", isInvariantCulture: true, format: "yyyy-MM-dd")]
[BindElement("select", null, "value", "onchange")] [BindElement("select", null, "value", "onchange")]
[BindElement("textarea", null, "value", "onchange")] [BindElement("textarea", null, "value", "onchange")]

View File

@ -4,11 +4,9 @@
namespace Microsoft.AspNetCore.Components.Web namespace Microsoft.AspNetCore.Components.Web
{ {
// Shared interop constants // Shared interop constants
internal static class BrowserUriHelperInterop internal static class BrowserNavigationManagerInterop
{ {
private static readonly string Prefix = "Blazor._internal.uriHelper."; private static readonly string Prefix = "Blazor._internal.navigationManager.";
public static readonly string ListenForNavigationEvents = Prefix + "listenForNavigationEvents";
public static readonly string EnableNavigationInterception = Prefix + "enableNavigationInterception"; public static readonly string EnableNavigationInterception = Prefix + "enableNavigationInterception";

Some files were not shown because too many files have changed in this diff Show More