mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
41 lines
1.5 KiB
C#
41 lines
1.5 KiB
C#
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
|||
|
using Newtonsoft.Json;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace Teknik.Utilities
|
|||
|
{
|
|||
|
public class FormDataJsonBinder : IModelBinder
|
|||
|
{
|
|||
|
public Task BindModelAsync(ModelBindingContext bindingContext)
|
|||
|
{
|
|||
|
if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext));
|
|||
|
|
|||
|
// Fetch the value of the argument by name and set it to the model state
|
|||
|
string fieldName = bindingContext.FieldName;
|
|||
|
var valueProviderResult = bindingContext.ValueProvider.GetValue(fieldName);
|
|||
|
if (valueProviderResult == ValueProviderResult.None) return Task.CompletedTask;
|
|||
|
else bindingContext.ModelState.SetModelValue(fieldName, valueProviderResult);
|
|||
|
|
|||
|
// Do nothing if the value is null or empty
|
|||
|
string value = valueProviderResult.FirstValue;
|
|||
|
if (string.IsNullOrEmpty(value)) return Task.CompletedTask;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
// Deserialize the provided value and set the binding result
|
|||
|
object result = JsonConvert.DeserializeObject(value, bindingContext.ModelType);
|
|||
|
bindingContext.Result = ModelBindingResult.Success(result);
|
|||
|
}
|
|||
|
catch (JsonException)
|
|||
|
{
|
|||
|
bindingContext.Result = ModelBindingResult.Failed();
|
|||
|
}
|
|||
|
|
|||
|
return Task.CompletedTask;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|