Skip to content

Commit c9fb9f6

Browse files
committed
Changed JSON config in InertiaOptions
1 parent fe3745a commit c9fb9f6

File tree

5 files changed

+41
-25
lines changed

5 files changed

+41
-25
lines changed

InertiaNetCore/Models/InertiaOptions.cs

+34-15
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,47 @@
44

55
namespace InertiaNetCore.Models;
66

7-
public class InertiaOptions
7+
public record InertiaJsonOptions
88
{
9-
public string RootView { get; set; } = "~/Views/App.cshtml";
9+
private InertiaJsonOptions()
10+
{
11+
}
1012

11-
public bool SsrEnabled { get; set; } = false;
12-
public string SsrUrl { get; set; } = "http://127.0.0.1:13714/render";
13-
14-
public Action<SessionOptions> ConfigureSession { get; set; } = _ => { };
15-
16-
public bool EncryptHistory { get; set; }
17-
18-
private static JsonSerializerOptions DefaultJsonSerializerOptions { get; } = new()
13+
internal object Options { get; private init; } = new JsonSerializerOptions
1914
{
2015
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
2116
ReferenceHandler = ReferenceHandler.IgnoreCycles,
2217
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase
2318
};
2419

25-
public object JsonSerializerOptions { get; set; } = DefaultJsonSerializerOptions;
26-
27-
public Func<object, InertiaOptions, string> JsonSerializeFn { get; set; } = (model, o) =>
20+
private Func<object, object, string> SerializeFn { get; init; } = (model, options)
21+
=> JsonSerializer.Serialize(model, options as JsonSerializerOptions);
22+
23+
internal string Serialize(object model) => SerializeFn(model, Options);
24+
25+
public static InertiaJsonOptions Default { get; } = new();
26+
27+
public static InertiaJsonOptions Create<T>(T options, Func<object, T, string>? serialize = null) where T : class
2828
{
29-
return JsonSerializer.Serialize(model, o.JsonSerializerOptions as JsonSerializerOptions);
30-
};
29+
serialize ??= (model, jo) => JsonSerializer.Serialize(model, jo as JsonSerializerOptions);
30+
return new InertiaJsonOptions
31+
{
32+
Options = options,
33+
SerializeFn = (model, jo) => serialize(model, (jo as T)!)
34+
};
35+
}
3136
}
37+
38+
public class InertiaOptions
39+
{
40+
public string RootView { get; set; } = "~/Views/App.cshtml";
41+
42+
public bool SsrEnabled { get; set; } = false;
43+
public string SsrUrl { get; set; } = "http://127.0.0.1:13714/render";
44+
45+
public Action<SessionOptions> ConfigureSession { get; set; } = _ => { };
46+
47+
public bool EncryptHistory { get; set; }
48+
49+
public InertiaJsonOptions Json { get; set; } = InertiaJsonOptions.Default;
50+
}

InertiaNetCore/Response.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public async Task ExecuteResultAsync(ActionContext context)
5050
context.HttpContext.Response.Headers.Append("Vary", "Accept");
5151
context.HttpContext.Response.StatusCode = 200;
5252

53-
var jsonResult = new JsonResult(page, _options.JsonSerializerOptions);
53+
var jsonResult = new JsonResult(page, _options.Json.Options);
5454
await jsonResult.ExecuteResultAsync(context);
5555
}
5656
}
@@ -92,8 +92,7 @@ private Dictionary<string, List<string>> GetDeferredProps(ActionContext context)
9292
}
9393

9494
// apply json serialization options to dictionary keys before grouping them
95-
var jsonOptions = _options.JsonSerializerOptions as JsonSerializerOptions;
96-
tmp = JsonSerializer.Deserialize<Dictionary<string, string>>(JsonSerializer.Serialize(tmp, jsonOptions), jsonOptions);
95+
tmp = JsonSerializer.Deserialize<Dictionary<string, string>>(_options.Json.Serialize(tmp));
9796

9897
return tmp!
9998
.GroupBy(prop => prop.Value)
@@ -116,8 +115,7 @@ private List<string> GetMergeProps(ActionContext context)
116115
}
117116

118117
// apply json serialization options to dictionary keys before grouping them
119-
var jsonOptions = _options.JsonSerializerOptions as JsonSerializerOptions;
120-
tmp = JsonSerializer.Deserialize<Dictionary<string, string>>(JsonSerializer.Serialize(tmp, jsonOptions), jsonOptions);
118+
tmp = JsonSerializer.Deserialize<Dictionary<string, string>>(_options.Json.Serialize(tmp));
121119

122120
return tmp!.Select(prop => prop.Key).ToList();
123121
}

InertiaNetCore/ResponseFactory.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public async Task<IHtmlContent> Html(dynamic model)
5656
}
5757
}
5858

59-
var data = options.Value.JsonSerializeFn(model, options.Value);
59+
var data = options.Value.Json.Serialize(model);
6060
var encoded = WebUtility.HtmlEncode(data);
6161

6262
return new HtmlString($"<div id=\"app\" data-page=\"{encoded}\"></div>");

InertiaNetCore/Ssr/SsrGateway.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ internal class SsrGateway(IHttpClientFactory httpClientFactory, IOptions<Inertia
99
{
1010
public async Task<SsrResponse?> Dispatch(dynamic model, string url)
1111
{
12-
var json = options.Value.JsonSerializeFn(model, options.Value);
12+
var json = options.Value.Json.Serialize(model);
1313

1414
var content = new StringContent(json.ToString(), Encoding.UTF8, "application/json");
1515

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,12 @@ For example, you can change JSON serializer settings to use `Newtonsoft.Json` in
7070
```csharp
7171
builder.Services.AddInertia(options =>
7272
{
73-
options.JsonSerializerSettings = new JsonSerializerSettings
73+
var options = new JsonSerializerSettings
7474
{
7575
ContractResolver = new CamelCasePropertyNamesContractResolver(),
7676
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
7777
};
78-
79-
options.JsonSerializeFn = model => JsonConvert.SerializeObject(model, options.JsonSerializerSettings);
78+
o.Json = InertiaJsonOptions.Create(options); // there is also an optional parameter to customize the "Serialize" method
8079
});
8180
```
8281

0 commit comments

Comments
 (0)