After looking through the source code for the DefaultModelBinder what I have found is that the ModelMetadata.ConvertEmptyStringToNull property is only ever checked when the model being bound is a complex model. For primative types exposed in an action, the values are retrieved as is. For the example in my original question, this would be an empty string.
From the DefaultModelBinder source
// Simple model = int, string, etc.; determined by calling TypeConverter.CanConvertFrom(typeof(string))
// or by seeing if a value in the request exactly matches the name of the model we're binding.
// Complex type = everything else.
if (!performedFallback) {
bool performRequestValidation = ShouldPerformRequestValidation(controllerContext, bindingContext);
ValueProviderResult vpResult = bindingContext.UnvalidatedValueProvider.GetValue(bindingContext.ModelName, skipValidation: !performRequestValidation);
if (vpResult != null) {
return BindSimpleModel(controllerContext, bindingContext, vpResult);
}
}
if (!bindingContext.ModelMetadata.IsComplexType) {
return null;
}
return BindComplexModel(controllerContext, bindingContext);
}
So as far as I can tell ModelMetadata.ConvertEmptyStringToNull only applies when bindng a complex type.