<< Back to Blog

21 NOVEMBER 2019

.NET Core: Custom Model Binder (for single field)

This example shows how to filter out specific sequences of characters from a user input string when binding to the model:

public class SpecialStringBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext))
        }

        var fieldName = bindingContext.FieldName
        if (string.IsNullOrEmpty(fieldName))
        {
            throw new Exception("Field name not found")
        }

        // Try to fetch the value of the argument by name
        var valueProviderResult = bindingContext.ValueProvider.GetValue(fieldName)

        if (valueProviderResult == ValueProviderResult.None)
        {
            return Task.CompletedTask
        }

        bindingContext.ModelState.SetModelValue(fieldName, valueProviderResult)

        var value = valueProviderResult.FirstValue

        if (string.IsNullOrEmpty(value))
        {
            return Task.CompletedTask
        }

        string model = value.Replace("\r", string.Empty).Replace("\n", string.Empty)

        bindingContext.Result = ModelBindingResult.Success(model)
        return Task.CompletedTask
    }
}

Add to property in model:

public class MyModel {
        [ModelBinder(BinderType = typeof(SpecialStringBinder))]
        [StringLength(150, ErrorMessage = "Max length 150 characters")]
        public string SpecialString { get set }
}