public ActionResult Create(FarmCropViewModel model) { var cache = MemoryCache.Default; //если есть в кэше - берём из него, в противном случае запрашиваем из IFarmService var rc = (cache.Get("regions") as IEnumerable <NamedItemViewModel>) ?? farmService.GetRegions().AsQueryable().ProjectTo <NamedItemViewModel>(mapper.ConfigurationProvider); var fc = (cache.Get("farmers") as IEnumerable <NamedItemViewModel>) ?? farmService.GetFarmers().AsQueryable().ProjectTo <NamedItemViewModel>(mapper.ConfigurationProvider); var ac = cache.Get("agricultures") as IEnumerable <NamedItemViewModel> ?? farmService.GetAgricultures().AsQueryable().ProjectTo <NamedItemViewModel>(mapper.ConfigurationProvider); //TODO: использовать полноценный тип для View ViewBag.Regions = rc; ViewBag.Farmers = fc; ViewBag.Agricultures = ac; if (model.Area <= 0) { ModelState.AddModelError("Area", "Площадь должна быть больше нуля"); } if (model.Gather < 0) { ModelState.AddModelError("Gather", "Урожай не может быть меньше нуля"); } if (!ModelState.IsValid) { return(View(model)); } try { var farmCrop = mapper.Map <FarmCropDto>(model); farmService.AddFarmCrop(farmCrop); } catch (ValidationException ex) { ModelState.AddModelError(ex.Property, ex.Message); return(View(model)); } return(RedirectToAction("List")); }
public ActionResult Create(FarmCropViewModel model) { /* * CR-1 - add check argument for null */ /* * CR-1 * Reduce code duplication with previous method, use ValueProvider class from comments above * Add cached values only in case of redirection back to create form because of failed validation */ var cache = MemoryCache.Default; //если есть в кэше - берём из него, в противном случае запрашиваем из IFarmService var rc = (cache.Get("regions") as IEnumerable <NamedItemViewModel>) ?? farmService.GetRegions().AsQueryable().ProjectTo <NamedItemViewModel>(mapper.ConfigurationProvider); var fc = (cache.Get("farmers") as IEnumerable <NamedItemViewModel>) ?? farmService.GetFarmers().AsQueryable().ProjectTo <NamedItemViewModel>(mapper.ConfigurationProvider); var ac = cache.Get("agricultures") as IEnumerable <NamedItemViewModel> ?? farmService.GetAgricultures().AsQueryable().ProjectTo <NamedItemViewModel>(mapper.ConfigurationProvider); ViewBag.Regions = rc; ViewBag.Farmers = fc; ViewBag.Agricultures = ac; /* * CR-1 * Gather all validation rules into one place - class FarmCropViewModel, let it validate its data, * Implement method FarmCropViewModel.Validate that returns dictionary with validation errors instead of exceptions * Check validation results here in controller. If there are no errors, save farm to DB. * If there are an errors, add them to ModelState and redirect back to form */ /* * CR-1 - change condition from "<=" to "<". */ if (model.Area <= 0) { ModelState.AddModelError("Area", "Площадь должна быть больше нуля"); } if (model.Gather < 0) { ModelState.AddModelError("Gather", "Урожай не может быть меньше нуля"); } if (!ModelState.IsValid) { /* * CR-1 - add regions, farmers and agricultures only here */ return(View(model)); } /* * CR-1 - get rid of exception based logic, use validation results from FarmCropViewModel */ try { var farmCrop = mapper.Map <FarmCropDto>(model); farmService.AddFarmCrop(farmCrop); } catch (ValidationException ex) { ModelState.AddModelError(ex.Property, ex.Message); return(View(model)); } return(RedirectToAction("List")); }