"The data field is required."
我误解错误信息的含义。 这意味着需要<代码>更新数据代码>。
详细解释一下,你之所以获得这一错误信息,是因为你发送了错误的数据类型价值,而具有约束力的模型系统不能对模型的价值加以约束。 因此,附后参数将获得<代码>null模型。 并且从“网络6”中,必须要求“<代码>不可损坏的财产”,否则“示范国家”将是无效的。 正因如此,你收到<代码>的错误。 数据领域是需要的。
If you add the ?
which can the parameter nullable:[FromBody] UpdateNameData? data
, then you can see it only receives one error message for cannot convert to string.
关于<代码>Name的财产,它不会收到要求验证的错误,因为你寄送了现场,而只是寄出错误的类型值。
如果你发出空洞的json:{><>>>>>>>/code>,你可以收到你希望的海关错误信息,因为你没有发送<条码>Name
在json string的现场。
UPDATE
How can I make it so that when the user sends a wrong type it returns
a custom error message?
ASP.NET 核心2.1和后版本添加了<代码>[ApiController]属性,自动处理模型验证错误,将其退回到BadRequestObjectResult
>。
简单的解决办法是,删除<代码>[ApiController],并完全退回你的错误信息:
if (!ModelState.IsValid)
{
return BadRequest(new { ErrorMessage = "Cannot deserialize the string" });
}
错误信息,如<代码> JSON数值不能转换为系统。 Sting. xxx是建筑中的错误。 480份答复的缺省答复类型为。 因此,我们将创立一个习俗类别,继承<代码>ValidationProblemDetails,并界定我们的习俗错误信息。
您目前的错误信息是:。 努力。 Path:$.name LineNumber: 1 P-4, 1 P-3, 1 P-2, 1 GS
public class CustomBadRequest : ValidationProblemDetails
{
public CustomBadRequest(ActionContext context)
{
ConstructErrorMessages(context);
Type = context.HttpContext.TraceIdentifier;
}
private void ConstructErrorMessages(ActionContext context)
{
//the build-in error message you get
var myerror = "The JSON value could not be converted to System.String. Path: $.name | LineNumber: 1 | BytePositionInLine: 10.";
foreach (var keyModelStatePair in context.ModelState)
{
var key = keyModelStatePair.Key;
var errors = keyModelStatePair.Value.Errors;
if (errors != null && errors.Count > 0)
{
if (errors.Count == 1)
{
var errorMessage = GetErrorMessage(errors[0]);
if (errorMessage == myerror)
{
Errors.Add(key, new[] { "The Name must be string" });
}
else
{
Errors.Add(key, new[] { errorMessage });
}
}
else
{
var errorMessages = new string[errors.Count];
for (var i = 0; i < errors.Count; i++)
{
errorMessages[i] = GetErrorMessage(errors[i]);
if (errorMessages[i] == myerror)
{
errorMessages[i] = "The Name must be string";
}
}
Errors.Add(key, errorMessages);
}
}
}
}
string GetErrorMessage(ModelError error)
{
return string.IsNullOrEmpty(error.ErrorMessage) ?
"The input was not valid." :
error.ErrorMessage;
}
}
方案:
builder.Services.AddControllers().AddXmlSerializerFormatters().ConfigureApiBehaviorOptions(options =>
{
options.InvalidModelStateResponseFactory = context =>
{
var problems = new CustomBadRequest(context);
return new BadRequestObjectResult(problems);
};
});
www.un.org/spanish/ecosoc 另一种方式是,如果你不想 man弄错误的信息,你可以习惯JsonConverter:
public class CustomStringConverter : JsonConverter<string>
{
public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
try
{
if (reader.TokenType == JsonTokenType.String)
{
// If the token is already a string, read and return it
return reader.GetString();
}
else
{
// Handle other token types or unexpected situations
throw new JsonException("Invalid token type. Expected a string.");
}
}
catch (JsonException ex)
{
// Custom error message for JSON serialization failure
throw new JsonException("Error converting value to string");
}
}
public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteString("Name", value);
writer.WriteEndObject();
}
}
你可以简单地回复坏要求的答复:
builder.Services.AddControllers().AddXmlSerializerFormatters().ConfigureApiBehaviorOptions(options =>
{
options.InvalidModelStateResponseFactory = context =>
{
var problems = context.ModelState.Values.SelectMany(
o => o.Errors.Select(
e => e.ErrorMessage));
return new BadRequestObjectResult(problems);
};
}).AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new CustomStringConverter());
});
或按惯例,反应方式,如拖欠的巴德雷斯反应:
builder.Services.AddControllers().AddXmlSerializerFormatters().ConfigureApiBehaviorOptions(options =>
{
options.InvalidModelStateResponseFactory = context =>
{
var problems = new CustomBadRequest(context);
return new BadRequestObjectResult(problems);
};
}).AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new CustomStringConverter());
});
习俗:
public class CustomBadRequest : ValidationProblemDetails
{
public CustomBadRequest(ActionContext context)
{
ConstructErrorMessages(context);
Type = context.HttpContext.TraceIdentifier;
}
private void ConstructErrorMessages(ActionContext context)
{
foreach (var keyModelStatePair in context.ModelState)
{
var key = keyModelStatePair.Key;
var errors = keyModelStatePair.Value.Errors;
if (errors != null && errors.Count > 0)
{
var errorMessages = new string[errors.Count];
for (var i = 0; i < errors.Count; i++)
{
errorMessages[i] = GetErrorMessage(errors[i]);
}
Errors.Add(key, errorMessages);
}
}
}
string GetErrorMessage(ModelError error)
{
return string.IsNullOrEmpty(error.ErrorMessage) ?
"The input was not valid." :
error.ErrorMessage;
}
}