Modelbinder 在返回 null 而不是控制器中设置的值时默认为 0
Modelbinder defaults to 0 when returning null instead of the value set in the controller
我有一个自定义模型活页夹,用于 REST API,如下所示:
public class CustomQueryModelBinder : IModelBinder
{
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
if (!String.IsNullOrWhiteSpace(bindingContext.ModelName) && bindingContext.ModelType == typeof(short) && bindingContext.ValueProvider.GetValue(bindingContext.ModelName) != null)
{
short value;
var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue as string;
if (String.IsNullOrWhiteSpace(val))
{
return ModelBindingResult.SuccessAsync(bindingContext.ModelName, val);
}
else if (Int16.TryParse(val, out value) && value >= 0)
{
return ModelBindingResult.SuccessAsync(bindingContext.ModelName, value);
}
else
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "The value is invalid.");
}
}
return ModelBindingResult.FailedAsync(bindingContext.ModelName);
}
}
并且在 URI 中未指定自定义值的情况下,它应默认为有效值 (大于 0),但它始终默认为 0
,即使控制器看起来如下:
public async Task<IActionResult> GetAsync(
[ModelBinder(BinderType = typeof(CustomQueryModelBinder))]short value = 100,
基本上这里的值应该设置为 100
作为它的默认值,当它 returns 从 ModelBinder
设置为 null
时。
然而,这并没有发生,它不断地作为 0
返回,这导致在尝试执行 Get 时 System.ArgumentOutOfRangeException
。
我们正在使用 RC1。
用 short? value = 100
替换 short value = 100
似乎对我有用。可为空类型万岁。
我有一个自定义模型活页夹,用于 REST API,如下所示:
public class CustomQueryModelBinder : IModelBinder
{
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
if (!String.IsNullOrWhiteSpace(bindingContext.ModelName) && bindingContext.ModelType == typeof(short) && bindingContext.ValueProvider.GetValue(bindingContext.ModelName) != null)
{
short value;
var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue as string;
if (String.IsNullOrWhiteSpace(val))
{
return ModelBindingResult.SuccessAsync(bindingContext.ModelName, val);
}
else if (Int16.TryParse(val, out value) && value >= 0)
{
return ModelBindingResult.SuccessAsync(bindingContext.ModelName, value);
}
else
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "The value is invalid.");
}
}
return ModelBindingResult.FailedAsync(bindingContext.ModelName);
}
}
并且在 URI 中未指定自定义值的情况下,它应默认为有效值 (大于 0),但它始终默认为 0
,即使控制器看起来如下:
public async Task<IActionResult> GetAsync(
[ModelBinder(BinderType = typeof(CustomQueryModelBinder))]short value = 100,
基本上这里的值应该设置为 100
作为它的默认值,当它 returns 从 ModelBinder
设置为 null
时。
然而,这并没有发生,它不断地作为 0
返回,这导致在尝试执行 Get 时 System.ArgumentOutOfRangeException
。
我们正在使用 RC1。
用 short? value = 100
替换 short value = 100
似乎对我有用。可为空类型万岁。