From cb32939c9a925c6959e3fc24155e2d0f22186f00 Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Sun, 30 Nov 2025 18:40:49 +0100 Subject: [PATCH 1/6] jus example --- MudBlazor.Extensions/version.generated.props | 2 +- .../Examples/ExampleBase.cs | 6 ++--- .../Shared/MudExDemoBox.razor | 14 +++++++++++- .../MainSample.WebAssembly/wwwroot/index.html | 22 +++++++++---------- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/MudBlazor.Extensions/version.generated.props b/MudBlazor.Extensions/version.generated.props index 238b17d3..5ac76b21 100644 --- a/MudBlazor.Extensions/version.generated.props +++ b/MudBlazor.Extensions/version.generated.props @@ -1,6 +1,6 @@ - 8.15.0-prev-251130154 + 8.15.1-prev-2511301834 8 15 8.15.0 diff --git a/Samples/MainSample.WebAssembly/Examples/ExampleBase.cs b/Samples/MainSample.WebAssembly/Examples/ExampleBase.cs index 136bce1d..1e15abcb 100644 --- a/Samples/MainSample.WebAssembly/Examples/ExampleBase.cs +++ b/Samples/MainSample.WebAssembly/Examples/ExampleBase.cs @@ -79,7 +79,7 @@ public async Task GetSourceCodeAsync() return code = CleanCode(code); } - public async Task> GetAdditionalCodeFilesAsync() + public async Task> GetAdditionalCodeFilesAsync(bool asMarkDown = true) { var client = new HttpClient(); var result = new Dictionary(); @@ -87,7 +87,7 @@ public async Task> GetAdditionalCodeFilesAsync() { var fileUrl = file.StartsWith("http") ? file : GH.Path(file); var code = await client.GetStringAsync(fileUrl); - result[file] = MudExCodeView.CodeAsMarkup(code); + result[file] = asMarkDown ? MudExCodeView.CodeAsMarkup(code) : code; } return result; } @@ -138,5 +138,5 @@ public interface IExample { public Task GetSourceCodeAsync(); public IComponent[]? ComponentRefs { get; } public bool HasAdditionalCodeFiles { get; } - public Task> GetAdditionalCodeFilesAsync(); + public Task> GetAdditionalCodeFilesAsync(bool asMarkDown = true); } \ No newline at end of file diff --git a/Samples/MainSample.WebAssembly/Shared/MudExDemoBox.razor b/Samples/MainSample.WebAssembly/Shared/MudExDemoBox.razor index 47de4146..2b6801c9 100644 --- a/Samples/MainSample.WebAssembly/Shared/MudExDemoBox.razor +++ b/Samples/MainSample.WebAssembly/Shared/MudExDemoBox.razor @@ -249,7 +249,19 @@ private async Task RunClicked() { await LoadCodeAsync(); - await TryMudExHelper.EditCodeInTryMudexAsync(Code, JsRuntime); + if (_example?.HasAdditionalCodeFiles == true) + { + var files = new Dictionary + { + { "__Main.razor", Code } + }; + files.AddRange(await _example.GetAdditionalCodeFilesAsync(false)); + await TryMudExHelper.EditCodeInTryMudexAsync(files, JsRuntime); + } + else + { + await TryMudExHelper.EditCodeInTryMudexAsync(Code, JsRuntime); + } } private async Task EditInstanceClicked(IComponent component) diff --git a/Samples/MainSample.WebAssembly/wwwroot/index.html b/Samples/MainSample.WebAssembly/wwwroot/index.html index 01c9b443..604a5590 100644 --- a/Samples/MainSample.WebAssembly/wwwroot/index.html +++ b/Samples/MainSample.WebAssembly/wwwroot/index.html @@ -21,17 +21,17 @@ - + - - - - + + + + - - - + + + @@ -48,7 +48,7 @@ -

MudBlazor.Extensions v8.15.0-prev-251130154

+

MudBlazor.Extensions v8.15.1-prev-2511301834

for MudBlazor 8.15.0

@@ -83,8 +83,8 @@

MudBlazor.Extensions v8.15.0-prev-251130154

- - + + From f21a58ff72667d3eed9a59109afd1c5f48a72663 Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Sun, 30 Nov 2025 19:23:02 +0100 Subject: [PATCH 2/6] init --- .github/workflows/TryMudEx.yml | 2 +- MudBlazor.Extensions/Helper/JsImportHelper.cs | 2 +- MudBlazor.Extensions/version.generated.props | 2 +- .../MudBlazor.Examples.Data.csproj | 2 +- TryMudEx/Try.Core/Try.Core.csproj | 8 ++++---- TryMudEx/Try.Tests/Try.Tests.csproj | 2 +- TryMudEx/TryMudEx.Client/Pages/Repl.razor.cs | 3 ++- TryMudEx/TryMudEx.Client/Program.cs | 4 ++-- TryMudEx/TryMudEx.Client/TryMudEx.Client.csproj | 11 ++++++----- TryMudEx/TryMudEx.Server/TryMudEx.Server.csproj | 12 ++++++------ TryMudEx/UserComponents/Try.UserComponents.csproj | 4 ++-- 11 files changed, 27 insertions(+), 25 deletions(-) diff --git a/.github/workflows/TryMudEx.yml b/.github/workflows/TryMudEx.yml index beabc5da..7c474b09 100644 --- a/.github/workflows/TryMudEx.yml +++ b/.github/workflows/TryMudEx.yml @@ -7,7 +7,7 @@ env: AZURE_WEBAPP_NAME: TryMudEx AZURE_WEBAPP_PACKAGE_PATH: .\published CONFIGURATION: Release - DOTNET_CORE_VERSION: 8.0.x + DOTNET_CORE_VERSION: 10.0.x WORKING_DIRECTORY: TryMudEx jobs: build: diff --git a/MudBlazor.Extensions/Helper/JsImportHelper.cs b/MudBlazor.Extensions/Helper/JsImportHelper.cs index e7fe590e..79edcd91 100644 --- a/MudBlazor.Extensions/Helper/JsImportHelper.cs +++ b/MudBlazor.Extensions/Helper/JsImportHelper.cs @@ -135,7 +135,7 @@ private static IJSInProcessRuntime GetJsRuntime() return null; } - var instanceField = defaultJsRuntimeType.GetField(instanceFieldName, BindingFlags.Static | BindingFlags.NonPublic); + var instanceField = defaultJsRuntimeType.GetField(instanceFieldName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); if (instanceField == null) { return null; diff --git a/MudBlazor.Extensions/version.generated.props b/MudBlazor.Extensions/version.generated.props index 5ac76b21..3c61a790 100644 --- a/MudBlazor.Extensions/version.generated.props +++ b/MudBlazor.Extensions/version.generated.props @@ -1,6 +1,6 @@ - 8.15.1-prev-2511301834 + 8.15.1-prev-2511301920 8 15 8.15.0 diff --git a/TryMudEx/MudBlazor.Examples.Data/MudBlazor.Examples.Data.csproj b/TryMudEx/MudBlazor.Examples.Data/MudBlazor.Examples.Data.csproj index d66f9897..38a4906d 100644 --- a/TryMudEx/MudBlazor.Examples.Data/MudBlazor.Examples.Data.csproj +++ b/TryMudEx/MudBlazor.Examples.Data/MudBlazor.Examples.Data.csproj @@ -1,7 +1,7 @@ - net8.0 + net10.0 diff --git a/TryMudEx/Try.Core/Try.Core.csproj b/TryMudEx/Try.Core/Try.Core.csproj index d4883b59..686c153e 100644 --- a/TryMudEx/Try.Core/Try.Core.csproj +++ b/TryMudEx/Try.Core/Try.Core.csproj @@ -1,15 +1,15 @@  - net8.0 + net10.0 - - + + - + diff --git a/TryMudEx/Try.Tests/Try.Tests.csproj b/TryMudEx/Try.Tests/Try.Tests.csproj index 4f6f1a4a..efb63864 100644 --- a/TryMudEx/Try.Tests/Try.Tests.csproj +++ b/TryMudEx/Try.Tests/Try.Tests.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 false diff --git a/TryMudEx/TryMudEx.Client/Pages/Repl.razor.cs b/TryMudEx/TryMudEx.Client/Pages/Repl.razor.cs index 8c510a60..3b7bc1eb 100644 --- a/TryMudEx/TryMudEx.Client/Pages/Repl.razor.cs +++ b/TryMudEx/TryMudEx.Client/Pages/Repl.razor.cs @@ -61,7 +61,8 @@ public partial class Repl : IDisposable [Inject] public IDialogService DialogService { get; set; } - [Inject] public IJSUnmarshalledRuntime UnmarshalledJsRuntime { get; set; } + //[Inject] public IJSUnmarshalledRuntime UnmarshalledJsRuntime { get; set; } + [Inject] public IJSRuntime UnmarshalledJsRuntime { get; set; } [Parameter] public bool ShowHiddenFiles { get; set; } diff --git a/TryMudEx/TryMudEx.Client/Program.cs b/TryMudEx/TryMudEx.Client/Program.cs index 3dc566a0..7be06bad 100644 --- a/TryMudEx/TryMudEx.Client/Program.cs +++ b/TryMudEx/TryMudEx.Client/Program.cs @@ -37,7 +37,7 @@ public static async Task Main(string[] args) builder.RootComponents.Add("head::after"); builder.Services.AddSingleton(serviceProvider => (IJSInProcessRuntime)serviceProvider.GetRequiredService()); - builder.Services.AddSingleton(serviceProvider => (IJSUnmarshalledRuntime)serviceProvider.GetRequiredService()); + //builder.Services.AddSingleton(serviceProvider => (IJSUnmarshalledRuntime)serviceProvider.GetRequiredService()); builder.Services.AddScoped(_ => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); builder.Services.AddScoped(); //builder.Services.AddSingleton(new CompilationService()); @@ -108,7 +108,7 @@ private static IJSInProcessRuntime GetJsRuntime() throw new MissingMemberException($"Couldn't find type '{defaultJsRuntimeTypeName}'."); } - var instanceField = defaultJsRuntimeType.GetField(instanceFieldName, BindingFlags.Static | BindingFlags.NonPublic); + var instanceField = defaultJsRuntimeType.GetField(instanceFieldName, BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public); if (instanceField == null) { throw new MissingMemberException($"Couldn't find property '{instanceFieldName}' in '{defaultJsRuntimeTypeName}'."); diff --git a/TryMudEx/TryMudEx.Client/TryMudEx.Client.csproj b/TryMudEx/TryMudEx.Client/TryMudEx.Client.csproj index 9ac18558..34d55df4 100644 --- a/TryMudEx/TryMudEx.Client/TryMudEx.Client.csproj +++ b/TryMudEx/TryMudEx.Client/TryMudEx.Client.csproj @@ -1,17 +1,18 @@  - net8.0 + net10.0 false false + false - - - - + + + + diff --git a/TryMudEx/TryMudEx.Server/TryMudEx.Server.csproj b/TryMudEx/TryMudEx.Server/TryMudEx.Server.csproj index 1dfeec03..2199d05e 100644 --- a/TryMudEx/TryMudEx.Server/TryMudEx.Server.csproj +++ b/TryMudEx/TryMudEx.Server/TryMudEx.Server.csproj @@ -1,16 +1,16 @@  - net8.0 + net10.0 1fd261c7-898b-40dc-b869-d96c4b787fc1 - - - - - + + + + + diff --git a/TryMudEx/UserComponents/Try.UserComponents.csproj b/TryMudEx/UserComponents/Try.UserComponents.csproj index ca8cd959..590d9c2a 100644 --- a/TryMudEx/UserComponents/Try.UserComponents.csproj +++ b/TryMudEx/UserComponents/Try.UserComponents.csproj @@ -1,10 +1,10 @@  - net8.0 + net10.0 - + From 0738b55f4a0a6ec6222af209e29c8dc843f7f6b9 Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Sun, 30 Nov 2025 21:50:28 +0100 Subject: [PATCH 3/6] fix --- MudBlazor.Extensions/version.generated.props | 2 +- .../TryMudEx.Client/wwwroot/editor/main.js | 113 ++++++++++++------ TryMudEx/TryMudEx.Client/wwwroot/index.html | 43 ++++++- 3 files changed, 116 insertions(+), 42 deletions(-) diff --git a/MudBlazor.Extensions/version.generated.props b/MudBlazor.Extensions/version.generated.props index 3c61a790..6c35610c 100644 --- a/MudBlazor.Extensions/version.generated.props +++ b/MudBlazor.Extensions/version.generated.props @@ -1,6 +1,6 @@ - 8.15.1-prev-2511301920 + 8.15.1-prev-2511302145 8 15 8.15.0 diff --git a/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js b/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js index 45a22b37..644fd2b5 100644 --- a/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js +++ b/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js @@ -1,4 +1,4 @@ -require.config({ paths: { 'vs': 'lib/monaco-editor/min/vs' } }); +require.config({ paths: { 'vs': 'lib/monaco-editor/min/vs' } }); let _dotNetInstance; @@ -8,7 +8,7 @@ function isScrollAtBottom(containerOrId) { if (typeof containerOrId === 'string' || containerOrId instanceof String) { containerOrId = document.querySelector(containerOrId); } - + return containerOrId.scrollHeight - containerOrId.scrollTop === containerOrId.clientHeight; } @@ -22,18 +22,17 @@ function registerLangugageProvider(language) { endColumn: position.column, }); - if(language == 'razor') - { + if (language == 'razor') { if ((textUntilPosition.match(/{/g) || []).length !== (textUntilPosition.match(/}/g) || []).length) { var data = await fetch("editor/snippets/csharp.json").then((response) => response.json()); } else { //var data = await fetch("editor/snippets/mudblazor.json").then((response) => response.json()); var data = await fetch("api/snippets/mudex.json").then((response) => response.json()); } - }else { + } else { var data = await fetch("editor/snippets/csharp.json").then((response) => response.json()); } - + var word = model.getWordUntilPosition(position); var range = { startLineNumber: position.lineNumber, @@ -41,12 +40,12 @@ function registerLangugageProvider(language) { startColumn: word.startColumn, endColumn: word.endColumn, }; - + var response = Object.keys(data).map(key => { return { label: data[key].prefix, - detail : data[key].description, - documentation : data[key].body.join('\n'), + detail: data[key].description, + documentation: data[key].body.join('\n'), insertText: data[key].body.join('\n'), kind: monaco.languages.CompletionItemKind.Snippet, insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, @@ -84,11 +83,11 @@ window.Try = { initialize: function (dotNetInstance) { _dotNetInstance = dotNetInstance; throttleLastTimeFuncNameMappings['compile'] = new Date(); - + window.addEventListener('keydown', onKeyDown); }, changeDisplayUrl: function (url) { - if (!url) {return; } + if (!url) { return; } window.history.pushState(null, null, url); }, reloadIframe: function (id, newSrc) { @@ -119,7 +118,7 @@ window.Try.Editor = window.Try.Editor || (function () { return { create: function (id, value, language, readOnly, theme) { if (!id) { return; } - + require(['vs/editor/editor.main'], () => { _editor = monaco.editor.create(document.getElementById(id), { value: _overrideValue || value || '', @@ -140,7 +139,7 @@ window.Try.Editor = window.Try.Editor || (function () { monaco.languages.html.razorDefaults.setModeConfiguration({ completionItems: true, - diagnostics: true, + diagnostics: true, documentFormattingEdits: true, documentHighlights: true, documentRangeFormattingEdits: true, @@ -157,7 +156,7 @@ window.Try.Editor = window.Try.Editor || (function () { return _editor.getValue(); }, setValue: function (value) { - if(_editor) { + if (_editor) { _editor.setValue(value); } else { _overrideValue = value; @@ -172,7 +171,7 @@ window.Try.Editor = window.Try.Editor || (function () { return _editor.focus(); }, setLanguage: function (language) { - if(_editor) { + if (_editor) { monaco.editor.setModelLanguage(_editor.getModel(), language); } }, @@ -205,18 +204,9 @@ window.Try.Editor = window.Try.Editor || (function () { window.Try.CodeExecution = window.Try.CodeExecution || (function () { const UNEXPECTED_ERROR_MESSAGE = 'An unexpected error has occurred. Please try again later or contact the team.'; - function putInCacheStorage(cache, fileName, fileBytes, contentType) { - const cachedResponse = new Response( - new Blob([fileBytes]), - { - headers: { - 'Content-Type': contentType || 'application/octet-stream', - 'Content-Length': fileBytes.length.toString() - } - }); - - return cache.put(fileName, cachedResponse); - } + // Hier halten wir die aktuellen UserComponents in Memory + let _userComponentsDllBytes = null; + let _userComponentsDllBase64 = null; function convertBase64StringToBytes(base64String) { const binaryString = window.atob(base64String); @@ -230,27 +220,78 @@ window.Try.CodeExecution = window.Try.CodeExecution || (function () { return bytes; } + function ensureBase64FromBytes(bytes) { + if (!bytes || !bytes.length) { + return null; + } + let binary = ""; + const len = bytes.length; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); + } + return { updateUserComponentsDll: async function (fileContent) { if (!fileContent) { return; } - //const cache = await caches.open('blazor-resources-/'); - const cache = await caches.open('dotnet-resources-/'); + // alter Code aus deinem Beispiel: Pointer → String + fileContent = typeof fileContent === 'number' + ? BINDING.conv_string(fileContent) + : fileContent; // raw pointer → mono string - const cacheKeys = await cache.keys(); - const userComponentsDllCacheKey = cacheKeys.find(x => x.url.indexOf('Try.UserComponents.dll') > -1); - if (!userComponentsDllCacheKey || !userComponentsDllCacheKey.url) { + let dllBytes; + let base64String; + + if (typeof fileContent === 'string') { + base64String = fileContent; + dllBytes = convertBase64StringToBytes(base64String); + } else if (fileContent instanceof Uint8Array) { + dllBytes = fileContent; + base64String = ensureBase64FromBytes(dllBytes); + } else { + alert(UNEXPECTED_ERROR_MESSAGE); + return; + } + + if (!(dllBytes instanceof Uint8Array)) { alert(UNEXPECTED_ERROR_MESSAGE); return; } - const dllPath = userComponentsDllCacheKey.url.substr(window.location.origin.length); - fileContent = typeof fileContent === 'number' ? BINDING.conv_string(fileContent) : fileContent // tranfering raw pointer to the memory of the mono string - const dllBytes = typeof fileContent === 'string' ? convertBase64StringToBytes(fileContent) : fileContent; + _userComponentsDllBytes = dllBytes; + _userComponentsDllBase64 = base64String; + + try { + if (base64String) { + sessionStorage.setItem('try-usercomponents-dll', base64String); + } + } catch (e) { + console.warn('Failed to persist user components dll to sessionStorage', e); + } + }, + + // Wird vom Bootloader (loadBootResource) verwendet + getUserComponentsDllBytes: function () { + if (_userComponentsDllBytes && _userComponentsDllBytes.length) { + return _userComponentsDllBytes; + } + + try { + const base64 = _userComponentsDllBase64 || sessionStorage.getItem('try-usercomponents-dll'); + if (base64) { + _userComponentsDllBase64 = base64; + _userComponentsDllBytes = convertBase64StringToBytes(base64); + return _userComponentsDllBytes; + } + } catch (e) { + console.warn('Failed to read user components dll from sessionStorage', e); + } - await putInCacheStorage(cache, dllPath, dllBytes); + return null; } }; }()); diff --git a/TryMudEx/TryMudEx.Client/wwwroot/index.html b/TryMudEx/TryMudEx.Client/wwwroot/index.html index 5ecfe525..3ed8272a 100644 --- a/TryMudEx/TryMudEx.Client/wwwroot/index.html +++ b/TryMudEx/TryMudEx.Client/wwwroot/index.html @@ -1,4 +1,5 @@ - + + @@ -10,7 +11,7 @@ - + @@ -57,9 +58,41 @@ Reload 🗙 - - - + + + + + + + + From 37abbde703c4c7436caf5d3521137b56a9e8e71d Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Sun, 30 Nov 2025 22:16:09 +0100 Subject: [PATCH 4/6] compile with newest lang features --- MudBlazor.Extensions/version.generated.props | 2 +- TryMudEx/Try.Core/Try.Core.csproj | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/MudBlazor.Extensions/version.generated.props b/MudBlazor.Extensions/version.generated.props index 6c35610c..e08b35b5 100644 --- a/MudBlazor.Extensions/version.generated.props +++ b/MudBlazor.Extensions/version.generated.props @@ -1,6 +1,6 @@ - 8.15.1-prev-2511302145 + 8.15.1-prev-251130222 8 15 8.15.0 diff --git a/TryMudEx/Try.Core/Try.Core.csproj b/TryMudEx/Try.Core/Try.Core.csproj index 686c153e..0104d312 100644 --- a/TryMudEx/Try.Core/Try.Core.csproj +++ b/TryMudEx/Try.Core/Try.Core.csproj @@ -2,6 +2,7 @@ net10.0 + preview @@ -11,6 +12,9 @@ + + + From 5ae71fa620e9fb5fbce4e7481b8c96e2fc52d224 Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Sun, 30 Nov 2025 22:20:47 +0100 Subject: [PATCH 5/6] - --- .github/workflows/TryMudEx.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/TryMudEx.yml b/.github/workflows/TryMudEx.yml index 7c474b09..79a5ba87 100644 --- a/.github/workflows/TryMudEx.yml +++ b/.github/workflows/TryMudEx.yml @@ -2,7 +2,8 @@ name: Deploy TryMudEx on: push: branches: - - 'main' + - '**' + workflow_dispatch: env: AZURE_WEBAPP_NAME: TryMudEx AZURE_WEBAPP_PACKAGE_PATH: .\published From dd019706a2fb7519db45beee677b69ef6f9ff595 Mon Sep 17 00:00:00 2001 From: Florian Gilde Date: Sun, 30 Nov 2025 22:39:55 +0100 Subject: [PATCH 6/6] finish --- MudBlazor.Extensions/version.generated.props | 2 +- .../TryMudEx.Client/wwwroot/editor/main.js | 22 +++++++++++++------ TryMudEx/TryMudEx.Client/wwwroot/index.html | 7 ++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/MudBlazor.Extensions/version.generated.props b/MudBlazor.Extensions/version.generated.props index e08b35b5..fab92021 100644 --- a/MudBlazor.Extensions/version.generated.props +++ b/MudBlazor.Extensions/version.generated.props @@ -1,6 +1,6 @@ - 8.15.1-prev-251130222 + 8.15.1-prev-2511302238 8 15 8.15.0 diff --git a/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js b/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js index 644fd2b5..1b1f6403 100644 --- a/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js +++ b/TryMudEx/TryMudEx.Client/wwwroot/editor/main.js @@ -94,15 +94,23 @@ window.Try = { const iFrame = document.getElementById(id); if (!iFrame) { return; } + // Standard-URL, wenn keine übergeben wurde if (!newSrc) { - iFrame.contentWindow.location.reload(); - } else if (iFrame.src !== `${window.location.origin}${newSrc}`) { - iFrame.src = newSrc; - } else { - // There needs to be some change so the iFrame is actually reloaded - iFrame.src = ''; - setTimeout(() => iFrame.src = newSrc); + newSrc = iFrame.getAttribute('data-base-src') || iFrame.getAttribute('src') || '/user-page'; } + + // Basis-URL merken (ohne alten Querystring) + const url = new URL(newSrc, window.location.origin); + url.searchParams.set('_cb', Date.now().toString()); // Cache-Buster + + const bustedSrc = url.pathname + url.search; + + // Immer komplett neu setzen, damit der Frame wirklich neu lädt + iFrame.src = ''; + setTimeout(() => { + iFrame.setAttribute('data-base-src', url.pathname); // Basis-URL merken + iFrame.src = bustedSrc; + }, 0); }, dispose: function () { _dotNetInstance = null; diff --git a/TryMudEx/TryMudEx.Client/wwwroot/index.html b/TryMudEx/TryMudEx.Client/wwwroot/index.html index 3ed8272a..0cfd55ec 100644 --- a/TryMudEx/TryMudEx.Client/wwwroot/index.html +++ b/TryMudEx/TryMudEx.Client/wwwroot/index.html @@ -1,6 +1,13 @@  +