Skip to content

Instantly share code, notes, and snippets.

@abdusco
Last active March 22, 2021 04:29
Show Gist options
  • Save abdusco/15415ed05b596f770cbf9ac925328916 to your computer and use it in GitHub Desktop.
Save abdusco/15415ed05b596f770cbf9ac925328916 to your computer and use it in GitHub Desktop.
ASP.NET Core custom model binder
public sealed class LoginType
{
public string Name { get; set; }
public static ICollection<LoginType> All { get; set; } = new List<LoginType>();
public static LoginType Internal = new LoginType(nameof(Internal));
public static LoginType Customer = new LoginType(nameof(Customer));
public static LoginType Impersonation = new LoginType(nameof(Impersonation));
private LoginType(string name)
{
Name = name;
All.Add(this);
}
public static LoginType? FromName(string name)
{
return All.FirstOrDefault(it => it.Name == name);
}
}
class LoginTypeModelBinderProvider : IModelBinderProvider
{
public IModelBinder? GetBinder(ModelBinderProviderContext context)
{
if (context?.Metadata.ModelType != typeof(LoginType))
{
return null;
}
return new LoginTypeBinder();
}
}
internal class LoginTypeBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var loginType = LoginType.FromName((string) value);
if (loginType != null)
{
bindingContext.Result = ModelBindingResult.Success(loginType);
}
else
{
bindingContext.Result = ModelBindingResult.Failed();
}
return Task.CompletedTask;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment