Код: Выделить всё
public enum MyEnum
{
[EnumMember(Name = "VALUE-1")]
VALUE_1,
[EnumMember(Name = "VALUE-2")]
VALUE_2
}
' pre class =" lang-class = "lang-class ="
Код: Выделить всё
public class StringEnumMemberModelBinder : IModelBinder
{
Task IModelBinder.BindModelAsync(ModelBindingContext bindingContext)
{
ValueProviderResult valueProviderResult =
bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
string? rawData = valueProviderResult.FirstValue;
if (string.IsNullOrEmpty(rawData))
{
bindingContext.ModelState.TryAddModelError(
bindingContext.ModelName,
"The value is required."
);
bindingContext.Result = ModelBindingResult.Failed();
}
else if (EnumHelper.TryParse(rawData, bindingContext.ModelType, out Enum result)) // EnumHelper logic omitted
{
bindingContext.Result = ModelBindingResult.Success(result);
}
else
{
bindingContext.ModelState.TryAddModelError(
bindingContext.ModelName,
$"Could not parse value '{rawData}' as '{bindingContext.ModelType.FullName}'."
);
bindingContext.Result = ModelBindingResult.Failed();
}
}
}
< /code>
Затем я применил связующую модель на уровне конечной точки, используя атрибуты: < /p>
public class MyController
{
[HttpGet]
[Route("")]
public async Task Get(
[FromHeader(Name = "X-CustomHeader")]
[ModelBinder(typeof(StringEnumMemberModelBinder))]
MyEnum e
)
{
// [...]
}
}
то, что я мог бы наблюдать во время отладки, является то, что BindingContext.ValuePRovverVerVerVerVerVerVerVerVerVerVerVerVerVerVerVIDE Это в основном коллекция поставщиков стоимости, предоставленных для операции. Когда я использую атрибут [fromheader] , коллекция состоит из routevalueprovider и опционы QuerystringValueProvider , если в запросе присутствует строка запроса. Похоже, что оба поставщика не могут обнаружить параметр в заголовке. С другой стороны, когда я использую [fromQuery] , коллекция состоит только из QuerystringValueProvider (если присутствует запрос QueryString) и успешно обнаруживает параметр в QueryString (как и ожидалось). Я ожидал, что поведение будет аналоговым при использовании [OffQuery] или [FromHeader] , то есть поставщиком значений будет QueryStringValueProvider в первом случае, а также какой -то вид HeadervalueProvider в последнем. Я очень уверен, что это разумное ожидание, потому что привязка контекста привязки правильно обнаруживает мой предполагаемый источник параметров в обоих случаях (
Код: Выделить всё
QueryКак я могу обойти все это?
Подробнее здесь: https://stackoverflow.com/questions/797 ... p-net-core
Мобильная версия