我有以下型号
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;}
}
我正在尝试实现自定义模型绑定器。如果提交的表单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;
}
}
问题
我在设置模型的值时遇到异常
Object of type 'Microsoft.Extensions.Primitives.StringValues' cannot be converted to type 'System.String
如果可能,我想避免检查模型目标属性的类型,然后将值转换为目标类型。这应该隐式发生。
基本上,对于所有匹配的键调用 ASP.NET 的默认绑定器,并为所有剩余的键添加值ExtraFields