私は次のモデルを持っています
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