«Неожиданный символ, обнаруженный при разборе значения:» вместо сообщения проверки во время привязки json из тела запроса - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю с 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...