У меня есть следующая модель
public class MyModel
{
public string Name {get;set;}
public int? Age {get;set;}
public string City {get;set;}
public decimal? Salary {get;set;}
public JObject ExtraFields {get;set;}
}
Я пытаюсь реализовать Custom Model Binder. Если отправленная форма имеет key
, что соответствует свойствам модели, тогда установите значение свойства модели, иначе добавьте ключ и значение к ExtraFields
. Обратите внимание, что ExtraFields
- это JObject
public class MyModelBinder: IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
MyModel model = new MyModel()
{
ExtraFields = new JObject()
};
var form = bindingContext.HttpContext.Request.Form;
var properties = typeof(MyModel).GetProperties();
foreach (var key in form.Keys)
{
var p = properties.FirstOrDefault(x => x.Name == key);
var val = form[key];
if (p != null)
{
p.SetValue(model, val); // throws exception
}
else
{
var v = StringValues.IsNullOrEmpty(val) ? null : val.ToString();
model.ExtraFields.Add(key, v);
}
}
bindingContext.Model = model;
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
Issue Я получаю исключение при установке значения модели
Object of type 'Microsoft.Extensions.Primitives.StringValues' cannot be converted to type 'System.String
Если возможно, я хотел бы избежать проверки типа целевого свойства модели, а затем преобразовать значение в целевой тип. Это должно происходить неявно.
В основном, для всех совпадающих ключей вызывается связка по умолчанию ASP. NET, а для всех оставшихся ключей добавляется значение ExtraFields