我有一个带有两个参数的控制器端点
我使用
[FromQuery]
作为第二个对象,因为我无法在体内传递两个对象
public class MyDTO
{
[Required(AllowEmptyStrings = true), StringLength(50)]
public string Details { get; set; }
public int value{ get; set; }
}
API控制器:
[HttpPost("getDetails")]
public async Task<List<getDetailsResult>> getDetails(List<string> dbList, [FromQuery] MyDTO data)
{}
当我使用“详细信息”字段的空字符串从 Angular 调用 api 时,它会作为 null 发送到 api,例如: http://sitename.com/api/getDetails?Details=&value=100
[Required(AllowEmptyStrings = true)]
属性被忽略,它将返回错误“详细信息字段为必填”
角度 http post 调用:
public getDetails(
dbList: string[],
details: string,
value: number
) {
let result;
let params = new HttpParams();
params = params.append("details", "");
params = params.append("value", 100);
result = this.http.post("/api/getDetails", dbList, {
params: params,
});
return result.toPromise().then((data: any) => {
//console.log(data);
return data;
});
}
我有两个问题:
如果该值,我如何允许使用必需属性调用 api 是空字符串吗?有什么方法可以将 null 值替换为空 字符串?
根据您的场景和共享代码片段,您实际上有两个选择。
首先使用自定义模型验证,另一个选项是ComponentModel.DataAnnotations
如果您想在这种情况下使用客户模型验证,您应该按以下方式重构您的代码:这样,您将对您的模型有更多的控制权。
模型验证器:
public class EmptyStringModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var model = new MyDTO();
if (bindingContext.ValueProvider.GetValue("Details").FirstOrDefault() == null)
{
model.Details = string.Empty;
}
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
型号:
[ModelBinder(BinderType = typeof(EmptyStringModelBinder))]
public class MyDTO
{
[StringLength(50)]
public string Details { get; set; }
public int value { get; set; }
}
或者,您也可以使用模型注释。
您可能知道,在 .NET 中,我们有
[DisplayFormat(ConvertEmptyStringToNull = true, NullDisplayText = "[Null]")]
可以将 null 值转换为空字符串 "" 如果未设置此属性,则 null 字段值将显示为空字符串 ("")。所以你可以修改你的模型如下:
public class MyDTO
{
[DisplayFormat(ConvertEmptyStringToNull = false, NullDisplayText = "")]
[StringLength(50)]
public string Details { get; set; }
public int value { get; set; }
}
输出:
注意:如果您想查看更多样本,请参考此官方文档。