【发布时间】:2020-07-14 19:00:34
【问题描述】:
我有以下型号
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
【问题讨论】:
-
根据文档:
(StringValues) Represents zero/null, one, or many strings in an efficient way.因此,无法实现到单个字符串值的转换。也许浏览一下 MVC 源代码,看看它是如何完成的? -
嗯我可能错了 - 这个答案似乎指向存在的隐式转换 - stackoverflow.com/a/48189292/426894
-
是的,我不知道我第一次是怎么错过的。 docs.microsoft.com/en-us/dotnet/api/…
-
是的,但我遇到了异常
标签: asp.net-core asp.net-core-mvc model-binding asp.net-core-2.1 defaultmodelbinder