У меня проблемы с пониманием процесса связывания модели в ядре Asp.Net 2. У меня очень простой API с моделью. У него есть некоторая базовая проверка. Всякий раз, когда пользователь публикует неверную модель, я пытаюсь вернуть 422 необработанного объекта вместе с сообщениями об ошибках из состояния модели.
2 проблемы, которые я пытаюсь понять, следующие:
Если я отправляю запрос без идентификатора, создается идентификатор по умолчанию 0, обходящий обязательный атрибут. Я предполагаю, что это функциональность C # для предоставления значений по умолчанию для полей. Есть ли способ обойти это?
Другая проблема заключается в том, что если я добавлю точку останова в свое почтовое действие и отправлю неверный запрос, он даже не перейдет в метод. Он отправляет обратно 400 неверных запросов с использованием атрибутов проверки. Как это работает? Останавливается ли запрос, как только он пытается связать модель с недопустимым свойством (т. Е. Длина имени> 10)? Что мне нужно сделать, это отправить обратно 422 необработанного объекта с тем же сообщением об ошибке вместо 400.
Не входит ли ASP.NET даже в метод, если проверка состояния модели завершается неудачно на основании атрибутов проверки? Что может быть лучше для решения этой проблемы, чтобы вернуть код ошибки 422?
Ниже приведен код для моих различных классов (я использовал шаблон API при создании проекта):
Startup.cs - Единственное, что я добавил здесь, это единственный экземпляр моего контекста в памяти
public void ConfigureServices(IServiceCollection services)
{
//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddMvc();
services.AddSingleton<IItemRepository, ItemRepository>();
}
IItemRepository.cs - Мой интерфейс для DI
public interface IItemRepository
{
List<ItemModel> Items { get; set; }
void AddValue(ItemModel itemModel);
}
ItemRepository.cs - Конкретная реализация
public class ItemRepository : IItemRepository
{
public List<ItemModel> Items { get; set; } = new List<ItemModel>();
public ItemRepository()
{
Items.AddRange(
new List<ItemModel> {
new ItemModel {Id = 1, Name = "Test1" },
new ItemModel {Id = 2, Name = "Test2" }
}
);
}
public void AddValue(ItemModel itemModel)
{
Items.Add(itemModel);
}
}
ItemModel.cs - Мой класс модели для пользовательского ввода
public class ItemModel
{
[Required]
public int Id { get; set; }
[MaxLength(10)]
public string Name { get; set; }
}
ValuesController.cs
[Route("api/[controller]")]
[ApiController]
public class ValuesController : Controller
{
private IItemRepository _context;
public ValuesController(IItemRepository context)
{
_context = context;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return Ok(_context.Items);
}
// GET api/values/5
[HttpGet("{id}", Name = "GetSingle")]
public ActionResult<string> Get(int id)
{
return Ok(_context.Items.Where(x => x.Id == id));
}
// Problem here - placing a breakpoint in below method does not do anytthing as it will return a 400 bad request instead of 422
[HttpPost]
public ActionResult Post([FromBody] ItemModel itemModel)
{
if (!ModelState.IsValid)
{
return new UnprocessableEntityObjectResult(ModelState);
}
ItemModel addNew = new ItemModel { Id = itemModel.Id, Name = itemModel.Name };
_context.AddValue(addNew);
return Ok(addNew);
}
}