Фреймворк использует связыватели моделей для сопоставления строк запроса в сложный объект, поэтому я предполагаю, что вам нужно будет создать связыватель пользовательских моделей. Пожалуйста, обратитесь Связывание пользовательских моделей в ASP.Net Core
Но до этого проще было бы попробовать атрибуты Binder в ваших моделях. Атрибут BindRequired добавляет ошибку состояния модели, если привязка невозможна. Таким образом, вы можете изменить свою модель как:
public class Thing
{
[BindRequired]
public string Description {get;set;}
[BindRequired]
public int Amount {get;set;}
}
Если это не сработает для вас, вы можете попытаться создать пользовательский механизм связывания моделей. Пример из статьи:
[ModelBinder(BinderType = typeof(AuthorEntityBinder))]
public class Author
{
public int Id { get; set; }
public string Name { get; set; }
public string GitHub { get; set; }
public string Twitter { get; set; }
public string BlogUrl { get; set; }
}
public class AuthorEntityBinder : IModelBinder
{
private readonly AppDbContext _db;
public AuthorEntityBinder(AppDbContext db)
{
_db = db;
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var modelName = bindingContext.ModelName;
// Try to fetch the value of the argument by name
var valueProviderResult =
bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
bindingContext.ModelState.SetModelValue(modelName,
valueProviderResult);
var value = valueProviderResult.FirstValue;
// Check if the argument value is null or empty
if (string.IsNullOrEmpty(value))
{
return Task.CompletedTask;
}
int id = 0;
if (!int.TryParse(value, out id))
{
// Non-integer arguments result in model state errors
bindingContext.ModelState.TryAddModelError(
modelName,
"Author Id must be an integer.");
return Task.CompletedTask;
}
// Model will be null if not found, including for
// out of range id values (0, -3, etc.)
var model = _db.Authors.Find(id);
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
Возможно, вы также захотите взглянуть на Проверка модели