Соглашения Asp.net в значительной степени основаны на рефлексии. Так что это может объяснить поведение. Я не проверял, действительно ли он не работает, но я уверен, что в этом состоянии вы уже пытались создать новый проект (POC), чтобы исключить какой-либо пользовательский код.
Может быть, это можно исправить, заглянув глубже в маршрутизацию (выбор метода) и исходный код ModelBinder ...
Я бы просто создал другое действие DuplicateRecord
.
Если вы не понимаете свой метод без этого комментария, это хороший признак того, что ваш текущий код, вероятно, все равно пахнет. (Вы делаете много для одного и того же):
// duplicates existing record if id is passed in, otherwise from scratch
Извлечение общих вещей в другой метод (возможно, даже в класс обслуживания) и наличие для каждого различия отдельного метода.
Тем не менее, идея универсального CrudController прекрасна, я попробовал это сам несколько лет назад. Но, пытаясь так, я ввел все виды общих параметров, шаблонов стратегий, делегатов событий, чтобы сделать возможными все возможности.
- Что произойдет, если вам понадобится объединение?
- Что произойдет, если вам понадобится транзакция?
- Как вы справляетесь с ошибками?
- Что произойдет, если вашей логике crud требуется 1, 2, 3 ... дополнительные параметры, чтобы решить, что делать?
- Soft Delete / Hard Delete?
- Каскадное удаление / ограничение удаления?
- Что произойдет, если вы ...
Я написал так много кода, что было бы здорово вернуться к старому доброму не универсальному коду. И если абстрагироваться от службы, ActionMethods действительно не нужно становиться большим.
public async Task<IActionResult> CreateProduct(CancellationToken ct, ProductCreateModel model)
{
var result = await _productService.CreateAsync(model, ct);
//create response with some helpers... probably some ActionFilters
}
Обобщения могут работать, как правило, в простом грубом отображении, в котором каждое представление имеет ровно одну сущность, но не очень хорошо масштабируется. Так что будьте осторожны и подумайте дважды о том, чего вы действительно хотите;)