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)); }