updated code to modern c#
8e365b7e54593ece96dcf0db678d821b69c8c04c
16 files changed
src/Mvc.ModelBinding.MultiParameter.Testing/Controllers/ComplexController.cssrc/Mvc.ModelBinding.MultiParameter.Testing/Mvc.ModelBinding.MultiParameter.Testing.csprojsrc/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/Default.jssrc/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/index.htmlsrc/Mvc.ModelBinding.MultiParameter/BindingSourceValueProvider.cssrc/Mvc.ModelBinding.MultiParameter/CookyValueProviderFactory.cssrc/Mvc.ModelBinding.MultiParameter/FormValueProviderFactory.cssrc/Mvc.ModelBinding.MultiParameter/FromCookyAttribute.cssrc/Mvc.ModelBinding.MultiParameter/GenericModelBinderProvider.cssrc/Mvc.ModelBinding.MultiParameter/GenericValueProvider.cssrc/Mvc.ModelBinding.MultiParameter/HeaderValueProviderFactory.cssrc/Mvc.ModelBinding.MultiParameter/IBindingSourceValueProvider.cssrc/Mvc.ModelBinding.MultiParameter/JsonValueProviderFactory.cssrc/Mvc.ModelBinding.MultiParameter/QueryStringValueProviderFactory.cssrc/Mvc.ModelBinding.MultiParameter/RouteValueProviderFactory.cssrc/Mvc.ModelBinding.MultiParameter/WithMultiParameterModelBindingExtensions.cs
diff --git a/src/Mvc.ModelBinding.MultiParameter.Testing/Controllers/ComplexController.cs b/src/Mvc.ModelBinding.MultiParameter.Testing/Controllers/ComplexController.cs
index 35babcf..3ee5661 100644
--- a/src/Mvc.ModelBinding.MultiParameter.Testing/Controllers/ComplexController.cs
+++ b/src/Mvc.ModelBinding.MultiParameter.Testing/Controllers/ComplexController.cs
@@ -6,8 +6,31 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
namespace Mvc.ModelBinding.MultiParameter.Testing.Controllers;
[Route("~/api")]
-public class ComplexController : ControllerBase
+public class ApiController : ControllerBase
{
+ [HttpGet("~/api/HelloWorld")]
+ public async Task<IActionResult> HelloWorld()
+ {
+ // Forces a session cooky
+ HttpContext.Session.SetString("Hello", "World");
+
+ await HttpContext.Session.CommitAsync();
+
+ HttpContext.Response.Cookies.Append("mycookie", "1234");
+
+ return Ok();
+ }
+
+ [HttpGet("~/api/GetHeader")]
+ public IActionResult GetHeader(string Accept)
+ {
+ return Ok(new
+ {
+ Value = Accept
+ });
+ }
+
+
[HttpGet("index")]
// 1.0
public async Task<IActionResult> Index(List<string> list)
@@ -193,16 +216,17 @@ public class ComplexController : ControllerBase
public override string ToString() => Name;
}
- [HttpGet("~/api/HelloWorld")]
- public async Task<IActionResult> HelloWorld()
- {
- // Forces a session cooky
- HttpContext.Session.SetString("Hello", "World");
- await HttpContext.Session.CommitAsync();
- return Ok();
+ [HttpGet("~/api/GetSomeSessionValue")]
+ public IActionResult GetSomeSessionValue(string Hello)
+ {
+ return Ok(new
+ {
+ Value = Hello
+ });
}
+
[HttpGet("~/api/NotANumber")]
public IActionResult NotANumber()
{
@@ -534,6 +558,26 @@ public class ComplexController : ControllerBase
public async Task<IActionResult> PostEnumAsString(StatusEnum status)
{
await Task.Yield();
- return Ok(true);
+ return Ok(new
+ {
+ Status = status.ToString(),
+ Value = (int)status
+ });
+ }
+
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="mycookie">the name of the var must the name of the cookie</param>
+ /// <returns></returns>
+ [HttpGet("~/api/GetCookie")]
+ public async Task<IActionResult> GetCookie(string mycookie)
+ {
+ await Task.Yield();
+ return Ok(new
+ {
+ Value = mycookie
+ });
}
}
diff --git a/src/Mvc.ModelBinding.MultiParameter.Testing/Mvc.ModelBinding.MultiParameter.Testing.csproj b/src/Mvc.ModelBinding.MultiParameter.Testing/Mvc.ModelBinding.MultiParameter.Testing.csproj
index 6a6e9aa..e0c67fc 100644
--- a/src/Mvc.ModelBinding.MultiParameter.Testing/Mvc.ModelBinding.MultiParameter.Testing.csproj
+++ b/src/Mvc.ModelBinding.MultiParameter.Testing/Mvc.ModelBinding.MultiParameter.Testing.csproj
@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="netproxy" Version="1.1.4" />
+ <PackageReference Include="netproxy" Version="3.0.1" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/Default.js b/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/Default.js
index e8cf2fb..5683430 100644
--- a/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/Default.js
+++ b/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/Default.js
@@ -1,17 +1,22 @@
-(function ()
+onReady(() =>
{
PageEvents();
Init();
-})();
+
+});
var result;
function PageEvents()
{
- document.addEventListener("click", function (e)
+ document.on("click", async function (e)
{
- if (typeof window[e.target.id] === "function")
- window[e.target.id].call(e, e);
+ if (e.target.id && typeof window[e.target.id] === "function")
+ {
+ const result = window[e.target.id].call(e, e);
+ if (result instanceof Promise)
+ await result;
+ }
});
$id("UploadExample").on("change", function (e)
@@ -43,6 +48,10 @@ async function UnitTest()
var user = { user: 'alphons' };
+ r = await netproxyasync("./api/GetCookie");
+ C("Cookies", "r.Value == '1234'");
+ r = await netproxyasync("./api/GetHeader");
+ C("Headers (Accept)", "r.Value == '*/*'");
r = await netproxyasync("./api/SimpleString1", user);
C("SimpleString1", "r.user == 'alphons'");
r = await netproxyasync("./api/SimpleString2", user);
@@ -235,7 +244,7 @@ async function UnitTest()
C("NotANumber", "r.Value == 'NaN'");
- C("ready", "true == false");
+ C("ready (must be false and red)", "true == false");
}
@@ -323,5 +332,19 @@ async function MultiBinderTest()
async function PostEnumAsString()
{
- var result = await netproxyasync("./api/PostEnumAsString", { status : 'Active' });
+ var result = await netproxyasync("./api/PostEnumAsString", { status: 'Active' });
+
+ $id("Result").innerText = ' status:' + result.Status + ' value:' + result.Value;
+}
+
+async function WriteCookie()
+{
+ await netproxyasync("./api/WriteCookie", { value: 'This is a cookie value' });
+}
+
+async function GetCookie()
+{
+ var result = await netproxyasync("./api/GetCookie");
+
+ $id("Result").innerText = "value from cookie is: " + result.Value;
}
diff --git a/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/index.html b/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/index.html
index 6769722..c56bc07 100644
--- a/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/index.html
+++ b/src/Mvc.ModelBinding.MultiParameter.Testing/wwwroot/index.html
@@ -8,7 +8,7 @@
<!-- nugetpackage netproxy -->
<link href="css/netproxyspinner.css" rel="stylesheet" />
<script src="scripts/macros.js" defer></script>
- <script src="scripts/netproxy.js" defer></script>
+ <script src="scripts/netproxy2.js?1" defer></script>
<link href="Default.css" rel="stylesheet" />
<link href="Ui.css" rel="stylesheet" />
@@ -16,6 +16,8 @@
</head>
<body>
+ <img src="images/netproxyspinner.gif" id="netproxyspinner" />
+
<div><span id="UnitTest" class="ui-btn">Unit Test</span></div>
<div id="Result"></div>
@@ -29,6 +31,9 @@
<div><span id="PostEnumAsString" class="ui-btn">Post Enum As String</span></div>
- <img src="images/netproxyspinner.gif" id="netproxyspinner" />
+ <div><span id="WriteCookie" class="ui-btn">WriteCookie</span></div>
+
+ <div><span id="GetCookie" class="ui-btn">GetCookie</span></div>
+
</body>
</html>
diff --git a/src/Mvc.ModelBinding.MultiParameter/BindingSourceValueProvider.cs b/src/Mvc.ModelBinding.MultiParameter/BindingSourceValueProvider.cs
index 91b7a8a..54067ef 100644
--- a/src/Mvc.ModelBinding.MultiParameter/BindingSourceValueProvider.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/BindingSourceValueProvider.cs
@@ -1,12 +1,11 @@
// BindingSourceValueProvider
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
public abstract class BindingSourceValueProvider : IBindingSourceValueProvider
{
/// <summary>
@@ -14,14 +13,11 @@ public abstract class BindingSourceValueProvider : IBindingSourceValueProvider
/// </summary>
/// <param name="bindingSource">
/// The <see cref="ModelBinding.BindingSource"/>. Must be a single-source (non-composite) with
- /// <see cref="ModelBinding.BindingSource.IsGreedy"/> equal to <c>false</c>.
+ /// <see cref="BindingSource.IsGreedy"/> equal to <c>false</c>.
/// </param>
public BindingSourceValueProvider(BindingSource bindingSource)
{
- if (bindingSource == null)
- {
- throw new ArgumentNullException(nameof(bindingSource));
- }
+ ArgumentNullException.ThrowIfNull(bindingSource);
BindingSource = bindingSource;
}
@@ -43,19 +39,12 @@ public abstract class BindingSourceValueProvider : IBindingSourceValueProvider
/// <inheritdoc />
public virtual IValueProvider? Filter(BindingSource bindingSource)
{
- if (bindingSource == null)
- {
- throw new ArgumentNullException(nameof(bindingSource));
- }
+ ArgumentNullException.ThrowIfNull(bindingSource);
if (bindingSource.CanAcceptDataFrom(BindingSource))
- {
return this;
- }
else
- {
return null;
- }
}
public virtual object? GetModel(string key, Type t)
diff --git a/src/Mvc.ModelBinding.MultiParameter/CookyValueProviderFactory.cs b/src/Mvc.ModelBinding.MultiParameter/CookyValueProviderFactory.cs
index 3b673a0..c367079 100644
--- a/src/Mvc.ModelBinding.MultiParameter/CookyValueProviderFactory.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/CookyValueProviderFactory.cs
@@ -1,15 +1,15 @@
// CookyValueProviderFactory
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
using System.Text.Json;
+using System.Text.RegularExpressions;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
-public class CookyValueProviderFactory : IValueProviderFactory
+public partial class CookyValueProviderFactory : IValueProviderFactory
{
private readonly JsonSerializerOptions? jsonSerializerOptions;
public CookyValueProviderFactory(JsonSerializerOptions? Options)
@@ -20,28 +20,63 @@ public class CookyValueProviderFactory : IValueProviderFactory
{
this.jsonSerializerOptions = null;
}
- public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
+
+ [GeneratedRegex("[\"\\\\\b\f\n\r\t]")]
+ private static partial Regex MyRegex();
+ private static string EscapeForJson(string value)
{
- if (context == null)
+ if (string.IsNullOrEmpty(value))
{
- throw new ArgumentNullException(nameof(context));
+ return string.Empty;
}
+
+ return MyRegex().Replace(value, match =>
+ {
+ return match.Value switch
+ {
+ "\"" => "\\\"",
+ "\\" => "\\\\",
+ "\b" => "\\b",
+ "\f" => "\\f",
+ "\n" => "\\n",
+ "\r" => "\\r",
+ "\t" => "\\t",
+ _ => match.Value
+ };
+ });
+ }
+
+ public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
+ {
+ ArgumentNullException.ThrowIfNull(context);
var cookies = context.ActionContext.HttpContext.Request.Cookies;
if (cookies != null && cookies.Count > 0)
{
- var list = cookies.Select(x => $"\"{x.Key}\": \"{x.Value}\"").ToArray();
- var json = $"{{{string.Join(',', list)}}}";
- var jsonDocument = JsonDocument.Parse(json, options: default);
+ try
+ {
+ var cookieList = cookies
+ .Select(cookie => $"\"{EscapeForJson(cookie.Key)}\": \"{EscapeForJson(cookie.Value)}\"")
+ .ToArray();
+
+ var json = $"{{{string.Join(',', cookieList)}}}";
+ var jsonDocument = JsonDocument.Parse(json, options: default);
- var valueProvider = new GenericValueProvider(
- BindingSource.Special,
- jsonDocument,
- null,
- jsonSerializerOptions);
+ var valueProvider = new GenericValueProvider(
+ BindingSource.Special,
+ jsonDocument,
+ null,
+ jsonSerializerOptions);
- context.ValueProviders.Add(valueProvider);
+ context.ValueProviders.Add(valueProvider);
+ }
+ catch (Exception ex)
+ {
+ Console.Error.WriteLine($"[CookyValueProvider] Error parsing cookies: {ex.Message}");
+ }
}
return Task.CompletedTask;
}
+
+
}
diff --git a/src/Mvc.ModelBinding.MultiParameter/FormValueProviderFactory.cs b/src/Mvc.ModelBinding.MultiParameter/FormValueProviderFactory.cs
index 6c21b15..f531739 100644
--- a/src/Mvc.ModelBinding.MultiParameter/FormValueProviderFactory.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/FormValueProviderFactory.cs
@@ -1,8 +1,8 @@
// FormValueProviderFactory
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
using System.Text.Json;
@@ -13,8 +13,6 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
-
/// <summary>
/// A <see cref="IValueProviderFactory"/> for <see cref="GenericValueProvider"/>.
/// </summary>
@@ -34,10 +32,7 @@ public class FormValueProviderFactory : IValueProviderFactory
/// <inheritdoc />
public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(context);
var request = context.ActionContext.HttpContext.Request;
if (request.HasFormContentType)
diff --git a/src/Mvc.ModelBinding.MultiParameter/FromCookyAttribute.cs b/src/Mvc.ModelBinding.MultiParameter/FromCookyAttribute.cs
index 91206db..da667a9 100644
--- a/src/Mvc.ModelBinding.MultiParameter/FromCookyAttribute.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/FromCookyAttribute.cs
@@ -8,8 +8,6 @@ using Microsoft.AspNetCore.Http.Metadata;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
-
//
// Summary:
// Specifies that a parameter or property should be bound using the request cookies.
diff --git a/src/Mvc.ModelBinding.MultiParameter/GenericModelBinderProvider.cs b/src/Mvc.ModelBinding.MultiParameter/GenericModelBinderProvider.cs
index 2fb5667..4f60a03 100644
--- a/src/Mvc.ModelBinding.MultiParameter/GenericModelBinderProvider.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/GenericModelBinderProvider.cs
@@ -1,14 +1,13 @@
// GenericModelBinder
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
using System.Runtime.ExceptionServices;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
/// <summary>
/// An <see cref="IGetModelProvider"/> sufficient for most objects.
@@ -28,16 +27,15 @@ public class GenericModelBinder : IModelBinder
public Task BindModelAsync(ModelBindingContext bindingContext)
{
- if (bindingContext == null)
- throw new ArgumentNullException(nameof(ModelBindingContext));
+ ArgumentNullException.ThrowIfNull(bindingContext);
var defaultContext = bindingContext as DefaultModelBindingContext;
- if (defaultContext == null)
- throw new ArgumentNullException(nameof(DefaultModelBindingContext));
+
+ ArgumentNullException.ThrowIfNull(defaultContext);
var compositeValueProvider = defaultContext.OriginalValueProvider as CompositeValueProvider;
- if (compositeValueProvider == null)
- throw new ArgumentNullException(nameof(CompositeValueProvider));
+
+ ArgumentNullException.ThrowIfNull(compositeValueProvider);
var bindingSource = bindingContext.BindingSource == BindingSource.FormFile ? BindingSource.Form :
bindingContext.BindingSource;
@@ -92,10 +90,7 @@ public class GenericModelBinderProvider : IModelBinderProvider
{
public IModelBinder? GetBinder(ModelBinderProviderContext context)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(context);
return new GenericModelBinder(context.Metadata.ModelType);
}
diff --git a/src/Mvc.ModelBinding.MultiParameter/GenericValueProvider.cs b/src/Mvc.ModelBinding.MultiParameter/GenericValueProvider.cs
index a9b861a..bb3b5af 100644
--- a/src/Mvc.ModelBinding.MultiParameter/GenericValueProvider.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/GenericValueProvider.cs
@@ -1,8 +1,8 @@
// GenericValueProvider
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
using System.Text.Json;
using System.ComponentModel;
@@ -11,39 +11,28 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
-
-public class GenericValueProvider : BindingSourceValueProvider
+public class GenericValueProvider(
+ BindingSource bindingSource,
+ JsonDocument? jsonDocument,
+ IFormCollection? form,
+ JsonSerializerOptions? options) : BindingSourceValueProvider(bindingSource)
{
- private readonly JsonSerializerOptions? jsonSerializerOptions;
- private readonly JsonDocument? jsonDocument;
- private readonly IFormCollection? form;
-
- public GenericValueProvider(BindingSource bindingSource, JsonDocument? jsonDocument, IFormCollection? form, JsonSerializerOptions? options) : base(bindingSource)
- {
- this.jsonSerializerOptions = options;
-
- this.jsonDocument = jsonDocument;
-
- this.form = form;
- }
-
public override bool ContainsPrefix(string prefix)
{
//System.Diagnostics.Debug.WriteLine($"ContainsPrefix({prefix}) BIndingSource:{BindingSource.DisplayName}");
- if (this.jsonDocument != null &&
- this.jsonDocument.RootElement.ValueKind == JsonValueKind.Object &&
- this.jsonDocument.RootElement.TryGetProperty(prefix, out _))
+ if (jsonDocument != null &&
+ jsonDocument.RootElement.ValueKind == JsonValueKind.Object &&
+ jsonDocument.RootElement.TryGetProperty(prefix, out _))
return true;
- if (this.form != null)
+ if (form != null)
{
- if (this.form.ContainsKey(prefix))
+ if (form.ContainsKey(prefix))
return true;
- if (this.form.Files != null &&
- this.form.Files.Any(x => x.Name == prefix))
+ if (form.Files != null &&
+ form.Files.Any(x => x.Name == prefix))
return true;
}
@@ -60,9 +49,9 @@ public class GenericValueProvider : BindingSourceValueProvider
{
//System.Diagnostics.Debug.WriteLine($"GetModel({key}) BIndingSource:{BindingSource.DisplayName}");
- if (this.jsonDocument != null &&
- this.jsonDocument.RootElement.ValueKind == JsonValueKind.Object &&
- this.jsonDocument.RootElement.TryGetProperty(key, out JsonElement prop))
+ if (jsonDocument != null &&
+ jsonDocument.RootElement.ValueKind == JsonValueKind.Object &&
+ jsonDocument.RootElement.TryGetProperty(key, out JsonElement prop))
{
// this needs some tweaking!!!
if (t.IsEnum && prop.ValueKind == JsonValueKind.String)
@@ -73,29 +62,29 @@ public class GenericValueProvider : BindingSourceValueProvider
}
else if (prop.ValueKind != JsonValueKind.Array || t.IsArray || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(List<>)))
{
- return prop.Deserialize(t, this.jsonSerializerOptions);
+ return prop.Deserialize(t, options);
}
else
{
var first = prop.EnumerateArray().FirstOrDefault();
if (first.ValueKind != JsonValueKind.Null)
- return first.Deserialize(t, this.jsonSerializerOptions);
+ return first.Deserialize(t, options);
}
}
- if (this.form != null)
+ if (form != null)
{
- if (this.form.ContainsKey(key))
+ if (form.ContainsKey(key))
{
var model = TypeDescriptor.GetConverter(t).ConvertFrom(
context: null,
culture: System.Globalization.CultureInfo.InvariantCulture,
- value: this.form[key][0]); // Needs some tweaking
+ value: form[key].FirstOrDefault() ?? new object()); // Needs some tweaking
return model;
}
- if (this.form.Files != null && t == typeof(IFormFile))
- return this.form.Files.FirstOrDefault(x => x.Name == key);
+ if (form.Files != null && t == typeof(IFormFile))
+ return form.Files.FirstOrDefault(x => x.Name == key);
}
return null;
}
diff --git a/src/Mvc.ModelBinding.MultiParameter/HeaderValueProviderFactory.cs b/src/Mvc.ModelBinding.MultiParameter/HeaderValueProviderFactory.cs
index ec3cbb0..b36eeff 100644
--- a/src/Mvc.ModelBinding.MultiParameter/HeaderValueProviderFactory.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/HeaderValueProviderFactory.cs
@@ -4,11 +4,11 @@
// Date: 2022-04-10
// Version: 1.2
+
using System.Text.Json;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
public class HeaderValueProviderFactory : IValueProviderFactory
{
private readonly JsonSerializerOptions? jsonSerializerOptions;
@@ -22,19 +22,13 @@ public class HeaderValueProviderFactory : IValueProviderFactory
}
public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(context);
var headers = context.ActionContext.HttpContext.Request.Headers;
if (headers != null && headers.Count > 0)
{
var json = JsonSerializer.Serialize(headers);
- //var list = request.Headers.Select(x => $"\"{x.Key}\": \"{x.Value[0]}\"").ToArray();
- //var json = $"{{{string.Join(',', list)}}}";
-
var jsonDocument = JsonDocument.Parse(json, options: default);
var valueProvider = new GenericValueProvider(
diff --git a/src/Mvc.ModelBinding.MultiParameter/IBindingSourceValueProvider.cs b/src/Mvc.ModelBinding.MultiParameter/IBindingSourceValueProvider.cs
index 31896a4..39c8430 100644
--- a/src/Mvc.ModelBinding.MultiParameter/IBindingSourceValueProvider.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/IBindingSourceValueProvider.cs
@@ -7,8 +7,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-#nullable enable
-
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
/// <summary>
diff --git a/src/Mvc.ModelBinding.MultiParameter/JsonValueProviderFactory.cs b/src/Mvc.ModelBinding.MultiParameter/JsonValueProviderFactory.cs
index 5f652c9..d6b8f0e 100644
--- a/src/Mvc.ModelBinding.MultiParameter/JsonValueProviderFactory.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/JsonValueProviderFactory.cs
@@ -1,14 +1,13 @@
// JsonValueProviderFactory
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
using System.Text.Json;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
public class JsonValueProviderFactory : IValueProviderFactory
{
private readonly JsonSerializerOptions? jsonSerializerOptions;
@@ -22,10 +21,7 @@ public class JsonValueProviderFactory : IValueProviderFactory
}
public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(context);
var request = context.ActionContext.HttpContext.Request;
diff --git a/src/Mvc.ModelBinding.MultiParameter/QueryStringValueProviderFactory.cs b/src/Mvc.ModelBinding.MultiParameter/QueryStringValueProviderFactory.cs
index c424912..667b547 100644
--- a/src/Mvc.ModelBinding.MultiParameter/QueryStringValueProviderFactory.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/QueryStringValueProviderFactory.cs
@@ -1,8 +1,8 @@
// QueryStringValueProviderFactory
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
@@ -11,7 +11,6 @@ using System.Text.Json;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
/// <summary>
/// A <see cref="IValueProviderFactory"/> that creates <see cref="GenericValueProvider"/> instances that
@@ -33,12 +32,9 @@ public class QueryStringValueProviderFactory : IValueProviderFactory
/// <inheritdoc />
public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(ValueProviderFactoryContext));
- }
+ ArgumentNullException.ThrowIfNull(context);
- var query = context.ActionContext.HttpContext.Request.Query;
+ var query = context.ActionContext.HttpContext.Request.Query;
if (query != null && query.Count > 0)
{
var list = query.Select(x => $"\"{x.Key}\": \"{x.Value}\"").ToArray();
diff --git a/src/Mvc.ModelBinding.MultiParameter/RouteValueProviderFactory.cs b/src/Mvc.ModelBinding.MultiParameter/RouteValueProviderFactory.cs
index 205ecec..a6e4e8c 100644
--- a/src/Mvc.ModelBinding.MultiParameter/RouteValueProviderFactory.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/RouteValueProviderFactory.cs
@@ -1,8 +1,8 @@
// RouteValueProviderFactory
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-10
-// Version: 1.2
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
@@ -11,7 +11,6 @@ using System.Text.Json;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.MultiParameter;
-#nullable enable
/// <summary>
/// A <see cref="IValueProviderFactory"/> for creating <see cref="GenericValueProvider"/> instances.
@@ -32,10 +31,7 @@ public class RouteValueProviderFactory : IValueProviderFactory
/// <inheritdoc />
public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(context);
var request = context.ActionContext.HttpContext.Request;
var jsonString = JsonSerializer.Serialize(request.RouteValues);
diff --git a/src/Mvc.ModelBinding.MultiParameter/WithMultiParameterModelBindingExtensions.cs b/src/Mvc.ModelBinding.MultiParameter/WithMultiParameterModelBindingExtensions.cs
index 03b4a88..c5135e0 100644
--- a/src/Mvc.ModelBinding.MultiParameter/WithMultiParameterModelBindingExtensions.cs
+++ b/src/Mvc.ModelBinding.MultiParameter/WithMultiParameterModelBindingExtensions.cs
@@ -1,8 +1,9 @@
// WithMultiParameterBindingExtensions
// (C) 2022 Alphons van der Heijden
-// Date: 2022-04-19
-// Version: 1.6
+// Version: 1.2 Date: 2022-04-10
+// Version: 1.3 Date: 2024-11-23
+
using System.Text.Json;
using System.Text.Json.Serialization;