public async Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (!int.TryParse(bindingContext.ValueProvider.GetValue("id").FirstValue, out int productId))
            {
                throw new Exception("The product id was not provided");
            }

            var editModel = new ProductConfigurationEditModel
            {
                Fields = productRepository.GetProductFields(productId)
            };

            for (int i = 0; i < editModel.Fields.Count; i++)
            {
                BaseField     field         = editModel.Fields[i];
                ModelMetadata modelMetadata = modelMetadataProvider.GetMetadataForType(field.GetType());
                IModelBinder  modelBinder   = modelBinderFactory.CreateBinder(new ModelBinderFactoryContext
                {
                    Metadata   = modelMetadata,
                    CacheToken = modelMetadata
                });

                string modelName = $"{bindingContext.BinderModelName}.Fields[{i}]".TrimStart('.');
                using (var scope = bindingContext.EnterNestedScope(modelMetadata, modelName, modelName, field))
                {
                    await modelBinder.BindModelAsync(bindingContext);
                }
            }

            bindingContext.Result = ModelBindingResult.Success(editModel);
        }
        public ProductConfigurationEditModel GetProductForEditing(int productId)
        {
            //This service generates some fields for the given productId
            var editModel = new ProductConfigurationEditModel()
            {
                Fields = productRepository.GetProductFields(productId)
            };

            return(editModel);
        }
 public void EditProduct(int productId, ProductConfigurationEditModel editModel)
 {
     productRepository.SaveProductFields(productId, editModel.Fields);
 }
 public IActionResult Edit([FromServices] IProductService productService, ProductConfigurationEditModel editModel, int id)
 {
     productService.EditProduct(id, editModel);
     TempData["Message"] = "Product was saved successfully";
     return(RedirectToAction(nameof(Edit), new { id = id }));
 }
        public IActionResult Edit([FromServices] IProductService productService, int id)
        {
            ProductConfigurationEditModel product = productService.GetProductForEditing(id);

            return(View(product));
        }