Смешивание пользовательских и стандартных моделей привязки - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно запустить некоторый код для дальнейшего связывания с данными для некоторой модели после выполнения привязки модели по умолчанию. Я не хочу полностью заменять существующую модель привязки.

Этот вопрос объясняет, как это делается в pre-CORE ASP.NET: ASP.NET MVC - сочетание пользовательской и стандартной привязки модели

Однако этот подход, похоже, не работает в ASP.NET Core, поскольку в нем больше нет класса DefaultModelBinder .

Какую альтернативу можно использовать в ASP.NET Core?

1 Ответ

0 голосов
/ 03 мая 2018

Вы можете использовать ComplexTypeModelBinder для выполнения фактической работы, а затем внедрить свою собственную логику после того, как это будет сделано.

Например (при условии, что ваш пользовательский тип MyCustomType):

public class MyCustomType
{
    public string Foo { get; set; }
}

public class MyCustomTypeModelBinder : IModelBinder
{
    private readonly IDictionary<ModelMetadata, IModelBinder> _propertyBinders;

    public MyCustomTypeModelBinder(IDictionary<ModelMetadata, IModelBinder> propertyBinders)
    {
        this._propertyBinders = propertyBinders;
    }

    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var complexTypeModelBinder = new ComplexTypeModelBinder(this._propertyBinders);

        // call complexTypeModelBinder
        await complexTypeModelBinder.BindModelAsync(bindingContext);

        var modelBound = bindingContext.Model as MyCustomType;

        // do your own magic here
        modelBound.Foo = "custominjected";
    }
}

public class MyCustomTypeModelBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context.Metadata.ModelType == typeof(MyCustomType))
        {
            var propertyBinders = new Dictionary<ModelMetadata, IModelBinder>();

            for (var i = 0; i < context.Metadata.Properties.Count; i++)
            {
                var property = context.Metadata.Properties[i];
                propertyBinders.Add(property, context.CreateBinder(property));
            }

            return new MyCustomTypeModelBinder(propertyBinders);
        }

        return null;
    }
}

Тогда зарегистрируйте его:

services.AddMvc(options =>
{
    options.ModelBinderProviders.Insert(0, new MyCustomTypeModelBinderProvider());
});
...