Я работаю с NET Core 3.1, и у меня есть следующая модель представления:
class MyViewModel
{
[Required(ErrorMessage = "Requireeeeedddddd!!!!!")]
[JsonProperty("advertisers")]
public List<int> AdvertisersIds { get; set; }
}
В контроллере у меня есть:
[HttpPost]
public async Task<IActionResult> Create([FromBody]FunnelViewModel viewModel)
{
if (!ModelState.IsValid)
{
return View(viewModel);
}
...
}
Но мой JSON не похож на
{
"advertisers": [1,2,3,4]
}
Мой JSON:
{
"advertisers": [
{"name": "hello", "id": 1 },
{"name": "hello2", "id": 12 },
]
}
Как видите, неправильный формат. Объекты вместо массива целых.
В Startup.cs
у меня есть:
services.AddControllersWithViews();
services.AddControllers().AddNewtonsoftJson();
И я использую новую конечную точку маршрутизации:
app.UseEndpoints(endpoints =>
{
// Mapping of endpoints goes here:
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
Итак, у меня есть как ответ от моего API 400 плохой запрос. И это нормально. Но сообщение проверки не в порядке. Это что-то вроде:
{"рекламодатели": ["При анализе значения обнаружен неожиданный символ: {. Path 'category', строка 1, позиция 45.", "Во время анализа значения обнаружен неожиданный символ: }. Путь 'категория', строка 1, позиция 45. "]}
Я знаю, что мне нужно настроить подшивку модели. Кто-нибудь может привести хороший универсальный пример?
Я ожидаю сообщения проверки от [Required(...)]
. Является ли это возможным? Или просто что-то вроде «Неправильный формат», который будет отображаться, если есть исключение при синтаксическом анализе.
Обновление
После некоторых исследований у меня есть следующий пользовательский механизм связывания моделей:
public class MyFromBody<T> : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
//Get command model payload (JSON) from the body
String valueFromBody;
using (var streamReader = new StreamReader(bindingContext.HttpContext.Request.Body))
{
valueFromBody = await streamReader.ReadToEndAsync();
}
object modelInstance = null;
try
{
modelInstance = JsonConvert.DeserializeObject<T>(valueFromBody);
}
catch (Exception e)
{
bindingContext.ModelState.AddModelError("JsonData",
"Wrong json format. Please check your json input.");
}
bindingContext.Result = ModelBindingResult.Success(modelInstance);
}
}
Использование:
public async Task<IActionResult> Create([ModelBinder(BinderType = typeof(MyFromBody<MyViewModel>))]
FunnelViewModel viewModel)
Сообщение проверки:
{"JsonData":["Wrong json format. Please check your json input."]}
Но этого мне недостаточно. Как улучшить, чтобы показать сообщение с атрибутом Required
?