0

私は次のモデルを持っています

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モデルのプロパティと一致するものがある場合は、モデルのプロパティ値を設定し、それ以外の場合はキーと値を に追加しますExtraFieldsExtraFieldsJObjectであることに注意してください

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

4

1 に答える 1