diff --git a/README.md b/README.md
index aa8c142..f0dd73c 100644
--- a/README.md
+++ b/README.md
@@ -33,27 +33,15 @@ to your project with the following command:
dotnet add package Ramstack.HtmxToolkit
```
-Register the toolkit and select the HTMX version used by the application:
-
-```csharp
-builder.Services.AddHtmxToolkit(options =>
-{
- options.UseHtmxV2(config =>
- {
- config.DefaultSwapStyle = HtmxSwap.OuterHtml;
- config.Timeout = 5000;
- config.GlobalViewTransitions = true;
- });
-});
-```
-
-HTMX 2.x is used by default. Calling `UseHtmxV2` is optional when no version-specific
-settings are required:
+Register the toolkit. HTMX 2.x is used by default:
```csharp
builder.Services.AddHtmxToolkit();
```
+To select another major version or override HTMX defaults, see
+[`HtmxConfigTagHelper`](#htmxconfigtaghelper).
+
## HttpRequest
The library provides the `HttpRequestExtensions` class for working with `HttpRequest`.
@@ -365,7 +353,7 @@ public static class HtmxResponseHeaderNames
}
```
-The most convenient approach is to use one of the `Htmx` extension methods.
+The most convenient approach is to use one of the `HttpResponse.Htmx` extension methods.
Its callback receives an `HtmxResponse`, allowing you to configure response headers in a fluent style:
```csharp
@@ -388,10 +376,14 @@ Response.Htmx(
ShouldStopPolling);
```
-:bulb: The `Htmx` extension methods are also available for `IActionResult`, allowing you to write:
+:bulb: The same API works in Minimal API handlers by binding `HttpResponse`:
```csharp
-return Json(profile).Htmx(h => h.StopPolling(ShouldStopPolling));
+app.MapGet("/profile", (HttpResponse response) =>
+{
+ response.Htmx(h => h.Retarget("#profile"));
+ return TypedResults.Content("
Profile
", "text/html");
+});
```
In all these examples, headers are set only for an HTMX request. For a regular request,
@@ -400,18 +392,18 @@ the callback passed to `Htmx` is not executed, avoiding unnecessary work.
### The declarative way of setting response headers
Some response headers can be set declaratively by applying `HtmxResponseAttribute`
-to a controller or action:
+to a controller or action. For example, an action that renders one new comment can append
+it to the element targeted by the request:
```csharp
-public class UserController : ControllerBase
+public class CommentController : Controller
{
[HtmxRequest]
- [HtmxResponse(
- StopPolling = true,
- Reswap = HtmxSwap.OuterHtml)]
- public IActionResult UpdateProfile(UserProfile profile)
+ [HtmxResponse(Reswap = HtmxSwap.BeforeEnd)]
+ public IActionResult Add(CommentInput input)
{
- ...
+ var comment = ...;
+ return PartialView("_Comment", comment);
}
}
```
@@ -689,16 +681,17 @@ With HTMX 4.x selected, the following HTML will be generated:
### HtmxConfigTagHelper
HTMX configuration is defined at application startup through `AddHtmxToolkit`.
-The version-specific callback exposes only settings supported by the selected HTMX version:
+The values apply application-wide and override HTMX defaults, so configure only behavior
+the application relies on. For example, a form-oriented application can report native
+validation failures before sending a request and scroll restored focus into view after a swap:
```csharp
builder.Services.AddHtmxToolkit(options =>
{
options.UseHtmxV2(config =>
{
- config.DefaultSwapStyle = HtmxSwap.OuterHtml;
- config.Timeout = 5000;
- config.GlobalViewTransitions = true;
+ config.ReportValidityOfForms = true;
+ config.DefaultFocusScroll = true;
});
});
```
@@ -716,7 +709,7 @@ The following markup will be generated:
```html
@@ -734,20 +727,10 @@ version explicitly. Each configuration type follows the names used by that HTMX
and 2.x expose `DefaultSwapStyle` and `Timeout`, while HTMX 4.x exposes `DefaultSwap` and
`DefaultTimeout`. Selecting different versions in the same configuration throws an exception.
-HTMX 4.x is currently in beta. To target it, select it explicitly and use its version-specific
-settings:
+HTMX 4.x is currently in beta. To target it, select it explicitly:
```csharp
-builder.Services.AddHtmxToolkit(options =>
-{
- options.UseHtmxV4(config =>
- {
- config.DefaultSwap = HtmxSwap.OuterHtml;
- config.DefaultTimeout = 5000;
- config.Transitions = true;
- config.NoSwap = ["204", "304", "4xx", "5xx"];
- });
-});
+builder.Services.AddHtmxToolkit(options => options.UseHtmxV4());
```
The configured values remain available through dependency injection:
@@ -784,7 +767,17 @@ builder.Services.AddHtmxToolkit(options =>
```
HTMX 4.x removes `responseHandling`. To retain HTMX 2.x behavior that does not swap error
-responses, configure `NoSwap` as shown in the HTMX 4.x example above.
+responses, configure `NoSwap` explicitly:
+
+```csharp
+builder.Services.AddHtmxToolkit(options =>
+{
+ options.UseHtmxV4(config =>
+ {
+ config.NoSwap = ["204", "304", "4xx", "5xx"];
+ });
+});
+```
## Toolkit Script
diff --git a/samples/Ramstack.HtmxToolkit.Demo/Pages/Examples/Headers.cshtml.cs b/samples/Ramstack.HtmxToolkit.Demo/Pages/Examples/Headers.cshtml.cs
index 813b0c8..146eb8a 100644
--- a/samples/Ramstack.HtmxToolkit.Demo/Pages/Examples/Headers.cshtml.cs
+++ b/samples/Ramstack.HtmxToolkit.Demo/Pages/Examples/Headers.cshtml.cs
@@ -9,11 +9,10 @@ public IActionResult OnGetCustomHeader()
{
Response.Htmx(h => h
.TriggerEvent("customEvent", new { message = "#1 Fired from server!" })
- .TriggerEvent("logEvent", new { message = $"Custom-Header = {Request.Headers["Custom-Header"]}" }));
+ .TriggerEvent("logEvent", new { message = $"Custom-Header = {Request.Headers["Custom-Header"]}" })
+ .TriggerEvent("customEvent", new { message = "#2 Fired from server!" })
+ .TriggerEvent("customEvent", new { message = "#3 Fired from server!" }));
- return Content("Custom headers sent!")
- .Htmx(h => h
- .TriggerEvent("customEvent", new { message = "#2 Fired from server!" })
- .TriggerEvent("customEvent", new { message = "#3 Fired from server!" }));
+ return Content("Custom headers sent!");
}
}
diff --git a/samples/Ramstack.HtmxToolkit.Demo/Program.cs b/samples/Ramstack.HtmxToolkit.Demo/Program.cs
index 45b7c64..28b1fea 100644
--- a/samples/Ramstack.HtmxToolkit.Demo/Program.cs
+++ b/samples/Ramstack.HtmxToolkit.Demo/Program.cs
@@ -1,5 +1,6 @@
using Ramstack.HtmxToolkit;
-using Ramstack.HtmxToolkit.Builder;
+using Ramstack.HtmxToolkit.Configuration;
+using Ramstack.HtmxToolkit.Hosting;
var builder = WebApplication.CreateBuilder(args);
diff --git a/src/Ramstack.HtmxToolkit/ActionResultExtensions.cs b/src/Ramstack.HtmxToolkit/ActionResultExtensions.cs
deleted file mode 100644
index 6c9bf3a..0000000
--- a/src/Ramstack.HtmxToolkit/ActionResultExtensions.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-
-namespace Ramstack.HtmxToolkit;
-
-///
-/// Provides extension methods for the interface
-/// that configures HTMX response headers.
-///
-public static class ActionResultExtensions
-{
- ///
- /// Configures HTMX response headers for the specified .
- ///
- /// The to configure.
- /// The delegate that configures the HTMX response headers.
- ///
- /// An that wraps .
- ///
- public static HtmxResult Htmx(this IActionResult result, Action configure) =>
- new(result, configure);
-
- ///
- /// Configures HTMX response headers for the specified using a state object.
- ///
- /// The type of the state object passed to the configuration delegate.
- /// The to configure.
- /// The delegate that configures the HTMX response headers using the state object.
- /// The state object passed to the delegate.
- ///
- /// An that wraps .
- ///
- public static HtmxResult Htmx(this IActionResult result, Action configure, TState state) =>
- new(result, configure, state);
-}
diff --git a/src/Ramstack.HtmxToolkit/HtmxBinaryType.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxBinaryType.cs
similarity index 94%
rename from src/Ramstack.HtmxToolkit/HtmxBinaryType.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxBinaryType.cs
index 13f16fc..f95730a 100644
--- a/src/Ramstack.HtmxToolkit/HtmxBinaryType.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxBinaryType.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Specifies how binary data received over a WebSocket connection is represented.
diff --git a/src/Ramstack.HtmxToolkit/HtmxConfig.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxConfig.cs
similarity index 97%
rename from src/Ramstack.HtmxToolkit/HtmxConfig.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxConfig.cs
index e467dc1..712743e 100644
--- a/src/Ramstack.HtmxToolkit/HtmxConfig.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxConfig.cs
@@ -2,7 +2,7 @@
using Microsoft.AspNetCore.Html;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Represents configuration for a specific major version of HTMX.
diff --git a/src/Ramstack.HtmxToolkit/HtmxFetchMode.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxFetchMode.cs
similarity index 95%
rename from src/Ramstack.HtmxToolkit/HtmxFetchMode.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxFetchMode.cs
index 3ec8c7f..c2fd9a0 100644
--- a/src/Ramstack.HtmxToolkit/HtmxFetchMode.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxFetchMode.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Specifies the request mode used by HTMX.
diff --git a/src/Ramstack.HtmxToolkit/HtmxHistoryMode.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxHistoryMode.cs
similarity index 90%
rename from src/Ramstack.HtmxToolkit/HtmxHistoryMode.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxHistoryMode.cs
index 58dc23f..4e26a2a 100644
--- a/src/Ramstack.HtmxToolkit/HtmxHistoryMode.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxHistoryMode.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Specifies how HTMX history restoration is handled.
diff --git a/src/Ramstack.HtmxToolkit/HtmxScrollBehavior.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxScrollBehavior.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/HtmxScrollBehavior.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxScrollBehavior.cs
index a29e312..e332ddb 100644
--- a/src/Ramstack.HtmxToolkit/HtmxScrollBehavior.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxScrollBehavior.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Specifies the scrolling behavior for a boosted link during page transitions.
diff --git a/src/Ramstack.HtmxToolkit/HtmxTargetVersion.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxTargetVersion.cs
similarity index 87%
rename from src/Ramstack.HtmxToolkit/HtmxTargetVersion.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxTargetVersion.cs
index 3a0d111..511c1eb 100644
--- a/src/Ramstack.HtmxToolkit/HtmxTargetVersion.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxTargetVersion.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Specifies the HTMX major version targeted by generated markup.
diff --git a/src/Ramstack.HtmxToolkit/HtmxToolkitOptions.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxToolkitOptions.cs
similarity index 99%
rename from src/Ramstack.HtmxToolkit/HtmxToolkitOptions.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxToolkitOptions.cs
index 4aff53e..fd66d17 100644
--- a/src/Ramstack.HtmxToolkit/HtmxToolkitOptions.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxToolkitOptions.cs
@@ -1,7 +1,7 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Represents configuration options for services provided by HTMX Toolkit.
diff --git a/src/Ramstack.HtmxToolkit/HtmxV1Config.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxV1Config.cs
similarity index 99%
rename from src/Ramstack.HtmxToolkit/HtmxV1Config.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxV1Config.cs
index 88753c3..6c83cd9 100644
--- a/src/Ramstack.HtmxToolkit/HtmxV1Config.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxV1Config.cs
@@ -1,7 +1,9 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace Ramstack.HtmxToolkit;
+using Ramstack.HtmxToolkit.Serialization;
+
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Represents the configuration for HTMX 1.x.
diff --git a/src/Ramstack.HtmxToolkit/HtmxV2Config.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxV2Config.cs
similarity index 99%
rename from src/Ramstack.HtmxToolkit/HtmxV2Config.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxV2Config.cs
index 2f76af9..0b6b95a 100644
--- a/src/Ramstack.HtmxToolkit/HtmxV2Config.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxV2Config.cs
@@ -1,9 +1,9 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-using Ramstack.HtmxToolkit.TagHelpers;
+using Ramstack.HtmxToolkit.Serialization;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Represents the configuration for HTMX 2.x.
diff --git a/src/Ramstack.HtmxToolkit/HtmxV4Config.cs b/src/Ramstack.HtmxToolkit/Configuration/HtmxV4Config.cs
similarity index 98%
rename from src/Ramstack.HtmxToolkit/HtmxV4Config.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HtmxV4Config.cs
index 84653aa..02d5eae 100644
--- a/src/Ramstack.HtmxToolkit/HtmxV4Config.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HtmxV4Config.cs
@@ -1,7 +1,9 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace Ramstack.HtmxToolkit;
+using Ramstack.HtmxToolkit.Serialization;
+
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Represents the configuration for HTMX 4.x.
diff --git a/src/Ramstack.HtmxToolkit/HttpVerb.cs b/src/Ramstack.HtmxToolkit/Configuration/HttpVerb.cs
similarity index 96%
rename from src/Ramstack.HtmxToolkit/HttpVerb.cs
rename to src/Ramstack.HtmxToolkit/Configuration/HttpVerb.cs
index 201f931..bf0ea86 100644
--- a/src/Ramstack.HtmxToolkit/HttpVerb.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/HttpVerb.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Defines the HTTP methods that can be used in HTMX configuration.
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/ResponseHandlingConfig.cs b/src/Ramstack.HtmxToolkit/Configuration/ResponseHandlingConfig.cs
similarity index 96%
rename from src/Ramstack.HtmxToolkit/TagHelpers/ResponseHandlingConfig.cs
rename to src/Ramstack.HtmxToolkit/Configuration/ResponseHandlingConfig.cs
index 29f617a..7e3ee82 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/ResponseHandlingConfig.cs
+++ b/src/Ramstack.HtmxToolkit/Configuration/ResponseHandlingConfig.cs
@@ -1,4 +1,4 @@
-namespace Ramstack.HtmxToolkit.TagHelpers;
+namespace Ramstack.HtmxToolkit.Configuration;
///
/// Represents the response handling configuration for responses that match
diff --git a/src/Ramstack.HtmxToolkit/Builder/EndpointRouteBuilderExtensions.cs b/src/Ramstack.HtmxToolkit/Hosting/EndpointRouteBuilderExtensions.cs
similarity index 98%
rename from src/Ramstack.HtmxToolkit/Builder/EndpointRouteBuilderExtensions.cs
rename to src/Ramstack.HtmxToolkit/Hosting/EndpointRouteBuilderExtensions.cs
index 9718fad..2897402 100644
--- a/src/Ramstack.HtmxToolkit/Builder/EndpointRouteBuilderExtensions.cs
+++ b/src/Ramstack.HtmxToolkit/Hosting/EndpointRouteBuilderExtensions.cs
@@ -3,7 +3,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
-namespace Ramstack.HtmxToolkit.Builder;
+namespace Ramstack.HtmxToolkit.Hosting;
///
/// Provides HTMX Toolkit endpoint mappings for an .
diff --git a/src/Ramstack.HtmxToolkit/Builder/ServiceCollectionExtensions.cs b/src/Ramstack.HtmxToolkit/Hosting/ServiceCollectionExtensions.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/Builder/ServiceCollectionExtensions.cs
rename to src/Ramstack.HtmxToolkit/Hosting/ServiceCollectionExtensions.cs
index d6fd5e6..607e972 100644
--- a/src/Ramstack.HtmxToolkit/Builder/ServiceCollectionExtensions.cs
+++ b/src/Ramstack.HtmxToolkit/Hosting/ServiceCollectionExtensions.cs
@@ -1,6 +1,8 @@
using Microsoft.Extensions.DependencyInjection;
-namespace Ramstack.HtmxToolkit.Builder;
+using Ramstack.HtmxToolkit.Configuration;
+
+namespace Ramstack.HtmxToolkit.Hosting;
///
/// Provides HTMX Toolkit service registration for an .
diff --git a/src/Ramstack.HtmxToolkit/HtmlHelperExtensions.cs b/src/Ramstack.HtmxToolkit/HtmlHelperExtensions.cs
index 3d6f8f7..1f7cca2 100644
--- a/src/Ramstack.HtmxToolkit/HtmlHelperExtensions.cs
+++ b/src/Ramstack.HtmxToolkit/HtmlHelperExtensions.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
-using Ramstack.HtmxToolkit.Builder;
+using Ramstack.HtmxToolkit.Hosting;
namespace Ramstack.HtmxToolkit;
diff --git a/src/Ramstack.HtmxToolkit/HtmxFieldValues.cs b/src/Ramstack.HtmxToolkit/HtmxFieldValues.cs
index b552d3b..206f026 100644
--- a/src/Ramstack.HtmxToolkit/HtmxFieldValues.cs
+++ b/src/Ramstack.HtmxToolkit/HtmxFieldValues.cs
@@ -2,6 +2,8 @@
using System.Runtime.CompilerServices;
using System.Text.Json.Serialization;
+using Ramstack.HtmxToolkit.Serialization;
+
namespace Ramstack.HtmxToolkit;
///
diff --git a/src/Ramstack.HtmxToolkit/HtmxLocationOptions.cs b/src/Ramstack.HtmxToolkit/HtmxLocationOptions.cs
index 4277559..713130b 100644
--- a/src/Ramstack.HtmxToolkit/HtmxLocationOptions.cs
+++ b/src/Ramstack.HtmxToolkit/HtmxLocationOptions.cs
@@ -1,5 +1,7 @@
using System.Text.Json.Serialization;
+using Ramstack.HtmxToolkit.Serialization;
+
namespace Ramstack.HtmxToolkit;
///
diff --git a/src/Ramstack.HtmxToolkit/HtmxResponse.cs b/src/Ramstack.HtmxToolkit/HtmxResponse.cs
index 986c128..8ea5c5d 100644
--- a/src/Ramstack.HtmxToolkit/HtmxResponse.cs
+++ b/src/Ramstack.HtmxToolkit/HtmxResponse.cs
@@ -4,6 +4,7 @@
using Microsoft.AspNetCore.Http;
using Ramstack.HtmxToolkit.Internal;
+using Ramstack.HtmxToolkit.Serialization;
namespace Ramstack.HtmxToolkit;
diff --git a/src/Ramstack.HtmxToolkit/HtmxResponseAttribute.cs b/src/Ramstack.HtmxToolkit/HtmxResponseAttribute.cs
index 8770ba6..f5d4a9b 100644
--- a/src/Ramstack.HtmxToolkit/HtmxResponseAttribute.cs
+++ b/src/Ramstack.HtmxToolkit/HtmxResponseAttribute.cs
@@ -68,20 +68,12 @@ public string Reselect
set => SetValue(HtmxResponseHeaderNames.Reselect, value);
}
- ///
- /// Gets or sets a value indicating whether to set HTTP status code 286 to stop polling.
- ///
- public bool StopPolling { get; set; }
-
///
public void OnResultExecuting(ResultExecutingContext context)
{
if (context.HttpContext.Request.IsHtmxRequest())
{
var response = context.HttpContext.Response;
- if (StopPolling)
- response.StatusCode = HtmxResponse.StopPollingStatusCode;
-
var headers = response.Headers;
foreach (ref var kvp in CollectionsMarshal.AsSpan(_headers))
headers[kvp.Key] = kvp.Value;
diff --git a/src/Ramstack.HtmxToolkit/HtmxResult.cs b/src/Ramstack.HtmxToolkit/HtmxResult.cs
deleted file mode 100644
index 6d8c9ac..0000000
--- a/src/Ramstack.HtmxToolkit/HtmxResult.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-
-namespace Ramstack.HtmxToolkit;
-
-///
-/// Represents an that when executed configures HTMX response headers
-/// before executing the wrapped result.
-///
-/// The action result to execute.
-/// The delegate that configures the HTMX response headers.
-public sealed class HtmxResult(IActionResult result, Action configure) : IActionResult
-{
- ///
- public Task ExecuteResultAsync(ActionContext context)
- {
- if (context.HttpContext.Request.IsHtmxRequest())
- {
- var response = new HtmxResponse(context.HttpContext.Response);
- configure(response);
- }
-
- return result.ExecuteResultAsync(context);
- }
-}
diff --git a/src/Ramstack.HtmxToolkit/HtmxResult`1.cs b/src/Ramstack.HtmxToolkit/HtmxResult`1.cs
deleted file mode 100644
index cbbadce..0000000
--- a/src/Ramstack.HtmxToolkit/HtmxResult`1.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-
-namespace Ramstack.HtmxToolkit;
-
-///
-/// Represents an that when executed configures HTMX response headers
-/// before executing the wrapped result.
-///
-/// The type of state passed to .
-/// The action result to execute.
-/// The delegate that configures the HTMX response headers
-/// using .
-/// The state passed to .
-///
-/// The state parameter enables callers to avoid closure allocations.
-///
-public sealed class HtmxResult(IActionResult result, Action configure, TState state) : IActionResult
-{
- ///
- public Task ExecuteResultAsync(ActionContext context)
- {
- if (context.HttpContext.Request.IsHtmxRequest())
- {
- var response = new HtmxResponse(context.HttpContext.Response);
- configure(response, state);
- }
-
- return result.ExecuteResultAsync(context);
- }
-}
diff --git a/src/Ramstack.HtmxToolkit/Internal/EnumHelper.cs b/src/Ramstack.HtmxToolkit/Internal/EnumHelper.cs
index 5d56111..8a13b89 100644
--- a/src/Ramstack.HtmxToolkit/Internal/EnumHelper.cs
+++ b/src/Ramstack.HtmxToolkit/Internal/EnumHelper.cs
@@ -1,3 +1,5 @@
+using Ramstack.HtmxToolkit.Configuration;
+
namespace Ramstack.HtmxToolkit.Internal;
///
diff --git a/src/Ramstack.HtmxToolkit/PendingEvents.cs b/src/Ramstack.HtmxToolkit/PendingEvents.cs
index 27fe7d4..a513e65 100644
--- a/src/Ramstack.HtmxToolkit/PendingEvents.cs
+++ b/src/Ramstack.HtmxToolkit/PendingEvents.cs
@@ -3,7 +3,7 @@
using Microsoft.AspNetCore.Http;
using Ramstack.HtmxToolkit.Collections;
-using Ramstack.HtmxToolkit.Internal;
+using Ramstack.HtmxToolkit.Serialization;
namespace Ramstack.HtmxToolkit;
diff --git a/src/Ramstack.HtmxToolkit/HtmxBinaryTypeJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxBinaryTypeJsonConverter.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/HtmxBinaryTypeJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxBinaryTypeJsonConverter.cs
index b1fbd5c..4d56482 100644
--- a/src/Ramstack.HtmxToolkit/HtmxBinaryTypeJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxBinaryTypeJsonConverter.cs
@@ -1,9 +1,10 @@
using System.Text.Json;
using System.Text.Json.Serialization;
+using Ramstack.HtmxToolkit.Configuration;
using Ramstack.HtmxToolkit.Internal;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents a for nullable values.
diff --git a/src/Ramstack.HtmxToolkit/HtmxConfigJsonSerializerContext.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxConfigJsonSerializerContext.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/HtmxConfigJsonSerializerContext.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxConfigJsonSerializerContext.cs
index 7dfcc3d..9b3a430 100644
--- a/src/Ramstack.HtmxToolkit/HtmxConfigJsonSerializerContext.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxConfigJsonSerializerContext.cs
@@ -1,8 +1,8 @@
using System.Text.Json.Serialization;
-using Ramstack.HtmxToolkit.Internal;
+using Ramstack.HtmxToolkit.Configuration;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents source-generated JSON serialization metadata for HTMX configuration data.
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxDictionaryJsonSerializerContext.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxDictionaryJsonSerializerContext.cs
similarity index 90%
rename from src/Ramstack.HtmxToolkit/TagHelpers/HtmxDictionaryJsonSerializerContext.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxDictionaryJsonSerializerContext.cs
index 5aea042..1ed83c4 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxDictionaryJsonSerializerContext.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxDictionaryJsonSerializerContext.cs
@@ -1,8 +1,6 @@
using System.Text.Json.Serialization;
-using Ramstack.HtmxToolkit.Internal;
-
-namespace Ramstack.HtmxToolkit.TagHelpers;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Provides source-generated JSON serialization metadata for HTMX string dictionaries.
diff --git a/src/Ramstack.HtmxToolkit/HtmxFetchModeJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxFetchModeJsonConverter.cs
similarity index 90%
rename from src/Ramstack.HtmxToolkit/HtmxFetchModeJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxFetchModeJsonConverter.cs
index 7ce7875..73542f2 100644
--- a/src/Ramstack.HtmxToolkit/HtmxFetchModeJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxFetchModeJsonConverter.cs
@@ -1,9 +1,10 @@
using System.Text.Json;
using System.Text.Json.Serialization;
+using Ramstack.HtmxToolkit.Configuration;
using Ramstack.HtmxToolkit.Internal;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents a for nullable values.
diff --git a/src/Ramstack.HtmxToolkit/HtmxFieldValuesJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxFieldValuesJsonConverter.cs
similarity index 95%
rename from src/Ramstack.HtmxToolkit/HtmxFieldValuesJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxFieldValuesJsonConverter.cs
index c40bddf..c11ad57 100644
--- a/src/Ramstack.HtmxToolkit/HtmxFieldValuesJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxFieldValuesJsonConverter.cs
@@ -2,7 +2,7 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents a JSON converter for .
diff --git a/src/Ramstack.HtmxToolkit/HtmxHistoryModeJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxHistoryModeJsonConverter.cs
similarity index 94%
rename from src/Ramstack.HtmxToolkit/HtmxHistoryModeJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxHistoryModeJsonConverter.cs
index 881e684..7321292 100644
--- a/src/Ramstack.HtmxToolkit/HtmxHistoryModeJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxHistoryModeJsonConverter.cs
@@ -1,7 +1,9 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace Ramstack.HtmxToolkit;
+using Ramstack.HtmxToolkit.Configuration;
+
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Converts values to the JSON representation expected
diff --git a/src/Ramstack.HtmxToolkit/HtmxLocationOptionsJsonSerializerContext.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxLocationOptionsJsonSerializerContext.cs
similarity index 92%
rename from src/Ramstack.HtmxToolkit/HtmxLocationOptionsJsonSerializerContext.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxLocationOptionsJsonSerializerContext.cs
index 90e5059..63e57f8 100644
--- a/src/Ramstack.HtmxToolkit/HtmxLocationOptionsJsonSerializerContext.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxLocationOptionsJsonSerializerContext.cs
@@ -1,8 +1,6 @@
using System.Text.Json.Serialization;
-using Ramstack.HtmxToolkit.Internal;
-
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Provides source-generated JSON serialization metadata for HX-Location options.
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestJsonSerializerContext.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxRequestJsonSerializerContext.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestJsonSerializerContext.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxRequestJsonSerializerContext.cs
index 09a65ef..3d215a6 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestJsonSerializerContext.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxRequestJsonSerializerContext.cs
@@ -1,8 +1,8 @@
using System.Text.Json.Serialization;
-using Ramstack.HtmxToolkit.Internal;
+using Ramstack.HtmxToolkit.TagHelpers;
-namespace Ramstack.HtmxToolkit.TagHelpers;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Provides source-generated JSON serialization metadata for HTMX request configuration data.
diff --git a/src/Ramstack.HtmxToolkit/HtmxScrollBehaviorJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxScrollBehaviorJsonConverter.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/HtmxScrollBehaviorJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxScrollBehaviorJsonConverter.cs
index aa4f63d..67963ff 100644
--- a/src/Ramstack.HtmxToolkit/HtmxScrollBehaviorJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxScrollBehaviorJsonConverter.cs
@@ -1,9 +1,10 @@
using System.Text.Json;
using System.Text.Json.Serialization;
+using Ramstack.HtmxToolkit.Configuration;
using Ramstack.HtmxToolkit.Internal;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents a for nullable values.
diff --git a/src/Ramstack.HtmxToolkit/HtmxSwapJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxSwapJsonConverter.cs
similarity index 94%
rename from src/Ramstack.HtmxToolkit/HtmxSwapJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxSwapJsonConverter.cs
index 44878f2..69c8f5d 100644
--- a/src/Ramstack.HtmxToolkit/HtmxSwapJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxSwapJsonConverter.cs
@@ -3,7 +3,7 @@
using Ramstack.HtmxToolkit.Internal;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents a for nullable values.
diff --git a/src/Ramstack.HtmxToolkit/HtmxTriggerSpecsCacheJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HtmxTriggerSpecsCacheJsonConverter.cs
similarity index 94%
rename from src/Ramstack.HtmxToolkit/HtmxTriggerSpecsCacheJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HtmxTriggerSpecsCacheJsonConverter.cs
index 627e5db..3252d4c 100644
--- a/src/Ramstack.HtmxToolkit/HtmxTriggerSpecsCacheJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HtmxTriggerSpecsCacheJsonConverter.cs
@@ -1,7 +1,7 @@
using System.Text.Json;
using System.Text.Json.Serialization;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Converts the boolean triggerSpecsCache abstraction to its HTMX JSON representation.
diff --git a/src/Ramstack.HtmxToolkit/HttpVerbArrayJsonConverter.cs b/src/Ramstack.HtmxToolkit/Serialization/HttpVerbArrayJsonConverter.cs
similarity index 91%
rename from src/Ramstack.HtmxToolkit/HttpVerbArrayJsonConverter.cs
rename to src/Ramstack.HtmxToolkit/Serialization/HttpVerbArrayJsonConverter.cs
index fa00f8d..51efde3 100644
--- a/src/Ramstack.HtmxToolkit/HttpVerbArrayJsonConverter.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/HttpVerbArrayJsonConverter.cs
@@ -1,9 +1,10 @@
using System.Text.Json;
using System.Text.Json.Serialization;
+using Ramstack.HtmxToolkit.Configuration;
using Ramstack.HtmxToolkit.Internal;
-namespace Ramstack.HtmxToolkit;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Represents a for arrays of values.
diff --git a/src/Ramstack.HtmxToolkit/Internal/JsonOptions.cs b/src/Ramstack.HtmxToolkit/Serialization/JsonOptions.cs
similarity index 96%
rename from src/Ramstack.HtmxToolkit/Internal/JsonOptions.cs
rename to src/Ramstack.HtmxToolkit/Serialization/JsonOptions.cs
index f25eac3..00a0b72 100644
--- a/src/Ramstack.HtmxToolkit/Internal/JsonOptions.cs
+++ b/src/Ramstack.HtmxToolkit/Serialization/JsonOptions.cs
@@ -3,7 +3,7 @@
using System.Text.Json.Serialization;
using System.Text.Unicode;
-namespace Ramstack.HtmxToolkit.Internal;
+namespace Ramstack.HtmxToolkit.Serialization;
///
/// Provides preconfigured for JSON serialization.
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxConfigTagHelper.cs b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxConfigTagHelper.cs
index cf2b5cd..4f31f6d 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxConfigTagHelper.cs
+++ b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxConfigTagHelper.cs
@@ -1,10 +1,11 @@
using Microsoft.AspNetCore.Antiforgery;
-using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
+using Ramstack.HtmxToolkit.Configuration;
+
namespace Ramstack.HtmxToolkit.TagHelpers;
///
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxHeaderTagHelper.cs b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxHeaderTagHelper.cs
index 5f7347d..359bfdd 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxHeaderTagHelper.cs
+++ b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxHeaderTagHelper.cs
@@ -4,6 +4,7 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
using Ramstack.HtmxToolkit.Collections;
+using Ramstack.HtmxToolkit.Serialization;
namespace Ramstack.HtmxToolkit.TagHelpers;
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestTagHelper.cs b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestTagHelper.cs
index 6420a9d..e23cd69 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestTagHelper.cs
+++ b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxRequestTagHelper.cs
@@ -4,6 +4,9 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
+using Ramstack.HtmxToolkit.Configuration;
+using Ramstack.HtmxToolkit.Serialization;
+
namespace Ramstack.HtmxToolkit.TagHelpers;
///
diff --git a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxValsTagHelper.cs b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxValsTagHelper.cs
index ad60952..8723f8c 100644
--- a/src/Ramstack.HtmxToolkit/TagHelpers/HtmxValsTagHelper.cs
+++ b/src/Ramstack.HtmxToolkit/TagHelpers/HtmxValsTagHelper.cs
@@ -4,6 +4,7 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
using Ramstack.HtmxToolkit.Collections;
+using Ramstack.HtmxToolkit.Serialization;
namespace Ramstack.HtmxToolkit.TagHelpers;
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxToolkitOptionsTests.cs b/tests/Ramstack.HtmxToolkit.Tests/Configuration/HtmxToolkitOptionsTests.cs
similarity index 97%
rename from tests/Ramstack.HtmxToolkit.Tests/HtmxToolkitOptionsTests.cs
rename to tests/Ramstack.HtmxToolkit.Tests/Configuration/HtmxToolkitOptionsTests.cs
index 1a11d62..adc4c3a 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxToolkitOptionsTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/Configuration/HtmxToolkitOptionsTests.cs
@@ -1,9 +1,10 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
-using Ramstack.HtmxToolkit.Builder;
+using Ramstack.HtmxToolkit.Configuration;
+using Ramstack.HtmxToolkit.Hosting;
-namespace Ramstack.HtmxToolkit.Tests;
+namespace Ramstack.HtmxToolkit.Tests.Configuration;
[TestFixture]
public class HtmxToolkitOptionsTests
diff --git a/tests/Ramstack.HtmxToolkit.Tests/EnumHelperTests.cs b/tests/Ramstack.HtmxToolkit.Tests/EnumHelperTests.cs
index 4b5e135..486dcc5 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/EnumHelperTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/EnumHelperTests.cs
@@ -1,3 +1,5 @@
+using Ramstack.HtmxToolkit.Configuration;
+
namespace Ramstack.HtmxToolkit.Tests;
[TestFixture]
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxResponseAttributeTests.cs b/tests/Ramstack.HtmxToolkit.Tests/HtmxResponseAttributeTests.cs
index cf711bb..1e29013 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxResponseAttributeTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/HtmxResponseAttributeTests.cs
@@ -40,29 +40,6 @@ public void OnResultExecuting_SetsNoHeaders_ForNonHtmxRequest()
Assert.That(ctx.Response.Headers.ContainsKey(HtmxResponseHeaderNames.Retarget), Is.False);
}
- [Test]
- public void OnResultExecuting_SetsStopPollingStatusCode_WhenStopPolling()
- {
- var ctx = TestHelper.CreateHtmxRequestContext();
- var res = new HtmxResponseAttribute { StopPolling = true };
-
- res.OnResultExecuting(CreateContext(ctx));
-
- Assert.That(ctx.Response.StatusCode, Is.EqualTo(HtmxResponse.StopPollingStatusCode));
- }
-
- [Test]
- public void OnResultExecuting_DoesNotSetStatusCode_WhenNotStopPolling()
- {
- var ctx = TestHelper.CreateHtmxRequestContext();
- var res = new HtmxResponseAttribute();
-
- res.OnResultExecuting(CreateContext(ctx));
-
- Assert.That(ctx.Response.StatusCode, Is.EqualTo(200));
- Assert.That(ctx.Response.StatusCode, Is.Not.EqualTo(HtmxResponse.StopPollingStatusCode));
- }
-
[Test]
public void Properties_RoundTrips()
{
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxResultTests.cs b/tests/Ramstack.HtmxToolkit.Tests/HtmxResultTests.cs
deleted file mode 100644
index eb59949..0000000
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxResultTests.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-
-namespace Ramstack.HtmxToolkit.Tests;
-
-[TestFixture]
-public class HtmxResultTests
-{
- [Test]
- public async Task ExecuteResultAsync_ConfiguresHeaders_ForHtmxRequest()
- {
- var context = TestHelper.CreateHtmxRequestContext();
- var recording = new RecordingResult();
- var result = new HtmxResult(recording, r => r.Retarget("#content"));
-
- await result.ExecuteResultAsync(CreateActionContext(context));
-
- Assert.That(recording.Executed, Is.True);
- Assert.That(context.Response.Headers[HtmxResponseHeaderNames.Retarget], Is.EqualTo("#content"));
- }
-
- [Test]
- public async Task ExecuteResultAsync_SkipsConfiguration_ForNonHtmxRequest()
- {
- var context = TestHelper.CreateHttpContext();
- var recording = new RecordingResult();
- var result = new HtmxResult(recording, r => r.Retarget("#content"));
-
- await result.ExecuteResultAsync(CreateActionContext(context));
-
- Assert.That(recording.Executed, Is.True);
- Assert.That(context.Response.Headers.ContainsKey(HtmxResponseHeaderNames.Retarget), Is.False);
- }
-
- [Test]
- public async Task ExecuteResultAsync_PassesStateToConfigure()
- {
- var context = TestHelper.CreateHtmxRequestContext();
- var recording = new RecordingResult();
- var result = new HtmxResult(recording, (r, s) => r.Redirect(s), "/foo");
-
- await result.ExecuteResultAsync(CreateActionContext(context));
-
- Assert.That(context.Response.Headers[HtmxResponseHeaderNames.Redirect], Is.EqualTo("/foo"));
- }
-
- [Test]
- public async Task HtmxExtension_WithState_CallbackReceivesProvidedState()
- {
- var context = TestHelper.CreateHtmxRequestContext();
- var recording = new RecordingResult();
- var result = recording.Htmx((r, s) => r.Redirect(s), "/foo");
-
- await result.ExecuteResultAsync(CreateActionContext(context));
-
- Assert.That(
- context.Response.Headers[HtmxResponseHeaderNames.Redirect],
- Is.EqualTo("/foo"));
- }
-
- private static ActionContext CreateActionContext(HttpContext httpContext) =>
- new(httpContext, new Microsoft.AspNetCore.Routing.RouteData(), new Microsoft.AspNetCore.Mvc.Abstractions.ActionDescriptor());
-
- private sealed class RecordingResult : IActionResult
- {
- public bool Executed { get; private set; }
-
- public Task ExecuteResultAsync(ActionContext context)
- {
- Executed = true;
- return Task.CompletedTask;
- }
- }
-}
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxConfigTagHelperTests.cs b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxConfigTagHelperTests.cs
similarity index 99%
rename from tests/Ramstack.HtmxToolkit.Tests/HtmxConfigTagHelperTests.cs
rename to tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxConfigTagHelperTests.cs
index da22898..5eef6ab 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxConfigTagHelperTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxConfigTagHelperTests.cs
@@ -5,7 +5,9 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
-namespace Ramstack.HtmxToolkit.Tests;
+using Ramstack.HtmxToolkit.Configuration;
+
+namespace Ramstack.HtmxToolkit.Tests.TagHelpers;
[TestFixture]
public class HtmxConfigTagHelperTests
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxHeaderTagHelperTests.cs b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxHeaderTagHelperTests.cs
similarity index 97%
rename from tests/Ramstack.HtmxToolkit.Tests/HtmxHeaderTagHelperTests.cs
rename to tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxHeaderTagHelperTests.cs
index 1a4e163..77b4dc7 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxHeaderTagHelperTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxHeaderTagHelperTests.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Razor.TagHelpers;
-namespace Ramstack.HtmxToolkit.Tests;
+namespace Ramstack.HtmxToolkit.Tests.TagHelpers;
[TestFixture]
public class HtmxHeaderTagHelperTests
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxRequestTagHelperTests.cs b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxRequestTagHelperTests.cs
similarity index 98%
rename from tests/Ramstack.HtmxToolkit.Tests/HtmxRequestTagHelperTests.cs
rename to tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxRequestTagHelperTests.cs
index 8673b2e..07d5123 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxRequestTagHelperTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxRequestTagHelperTests.cs
@@ -2,7 +2,9 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
-namespace Ramstack.HtmxToolkit.Tests;
+using Ramstack.HtmxToolkit.Configuration;
+
+namespace Ramstack.HtmxToolkit.Tests.TagHelpers;
[TestFixture]
public class HtmxRequestTagHelperTests
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxUrlTagHelperTests.cs b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxUrlTagHelperTests.cs
similarity index 99%
rename from tests/Ramstack.HtmxToolkit.Tests/HtmxUrlTagHelperTests.cs
rename to tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxUrlTagHelperTests.cs
index edf544f..c3a9ad1 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxUrlTagHelperTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxUrlTagHelperTests.cs
@@ -6,7 +6,7 @@
using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.AspNetCore.Routing;
-namespace Ramstack.HtmxToolkit.Tests;
+namespace Ramstack.HtmxToolkit.Tests.TagHelpers;
[TestFixture]
public class HtmxUrlTagHelperTests
diff --git a/tests/Ramstack.HtmxToolkit.Tests/HtmxValsTagHelperTests.cs b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxValsTagHelperTests.cs
similarity index 97%
rename from tests/Ramstack.HtmxToolkit.Tests/HtmxValsTagHelperTests.cs
rename to tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxValsTagHelperTests.cs
index c884e04..1211e25 100644
--- a/tests/Ramstack.HtmxToolkit.Tests/HtmxValsTagHelperTests.cs
+++ b/tests/Ramstack.HtmxToolkit.Tests/TagHelpers/HtmxValsTagHelperTests.cs
@@ -1,7 +1,7 @@
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Razor.TagHelpers;
-namespace Ramstack.HtmxToolkit.Tests;
+namespace Ramstack.HtmxToolkit.Tests.TagHelpers;
[TestFixture]
public class HtmxValsTagHelperTests