Пример #1
0
        private List <CompetitorViewModel> GetData(int partnerId, string quarter)
        {
            var CompetitorVMList = new List <CompetitorViewModel>();
            var Competitors      = _db.Competitors;

            foreach (var Competitor in Competitors)
            {
                var CompetitorsLi = _db.CompetitorLandscapes.FirstOrDefault(t => t.PartnerId == partnerId && t.QuarterYear == quarter && t.CategoryId == Competitor.CategoryId);

                if (CompetitorsLi == null)
                {
                    CompetitorsLi = new Data.Models.CompetitorLandscape();
                }

                var CompetitorVM = new CompetitorViewModel
                {
                    CompetitorId      = CompetitorsLi.CompetitorId,
                    Share             = CompetitorsLi.Share,
                    BrandPresenc      = CompetitorsLi.BrandPresenc,
                    PriceStrategy     = CompetitorsLi.PriceStrategy,
                    StoreInvestment   = CompetitorsLi.StoreInvestment,
                    AdditionalComment = CompetitorsLi.AdditionalComment,
                    PartnerId         = CompetitorsLi.PartnerId,
                    CategoryName      = Competitor.CategoryName,
                    CompetitorName    = Competitor.CompetitorName,
                    CategoryId        = Competitor.CategoryId,
                    QuarterYear       = CompetitorsLi.QuarterYear
                };

                CompetitorVMList.Add(CompetitorVM);
            }
            return(CompetitorVMList.OrderBy(c => c.CategoryName).ToList());
        }
Пример #2
0
        public ActionResult RecentCompetitors()
        {
            var recentCompetitors = _competitorService.GetRecentlyAddedCompetitors();
            var viewModel         = CompetitorViewModel.BuildList(recentCompetitors);

            return(PartialView("CompetitorListPartial", viewModel));
        }
Пример #3
0
        public ActionResult AddCompetitor()
        {
            var viewModel = new CompetitorViewModel();

            ViewBag.EditType = "Add";

            return(View("EditCompetitor", viewModel));
        }
Пример #4
0
        public ActionResult AddCompetitor(CompetitorViewModel viewModel)
        {
            var competitor = viewModel.Map();

            _competitorService.InsertCompetitor(competitor);

            return(RedirectToAction(nameof(CompetitorManagement)));
        }
Пример #5
0
        public ActionResult EditCompetitor(int competitorId)
        {
            var competitor = _competitorService.GetCompetitorById(competitorId);
            var viewModel  = CompetitorViewModel.Build(competitor);

            ViewBag.EditType = "Edit";

            return(View(viewModel));
        }
Пример #6
0
 public ActionResult Edit([Bind(Include = "CompetitorId,CompName,Market,BasedIn,CompUrl")] CompetitorViewModel competitor)
 {
     if (ModelState.IsValid)
     {
         _compService.Save(competitor);
         return(RedirectToAction("Index"));
     }
     return(View(competitor));
 }
Пример #7
0
        public CompetitorViewModel Save(CompetitorViewModel competitor)
        {
            var comp = FromComp(competitor);

            db.Entry(comp).State = EntityState.Modified;
            db.SaveChanges();

            return(CompDto(comp));
        }
Пример #8
0
        public CompetitorViewModel Create(CompetitorViewModel competitor)
        {
            var comp = FromComp(competitor);

            db.Competitors.Add(comp);
            db.SaveChanges();

            comp.CompetitorId = competitor.CompetitorId;
            return(CompDto(comp));
        }
Пример #9
0
        // GET: Competitor
        public ActionResult Index()
        {
            var competitorList = GetCompetitors() as JsonResult;

            var competitorViewModel = new CompetitorViewModel
            {
                CompetitorList = competitorList.Data as MessageResult <CompetitorModel>
            };

            return(View(competitorViewModel));
        }
Пример #10
0
        private static Competitor FromComp(CompetitorViewModel competitor)
        {
            var comp = new Competitor
            {
                CompetitorId = competitor.CompetitorId,
                CompName     = competitor.CompName,
                Market       = competitor.Market,
                CompUrl      = competitor.CompUrl,
                BasedIn      = competitor.BasedIn
            };

            return(comp);
        }
        // GET: Competitors/Create
        public ActionResult Create()
        {
            // MultiSelectList will hold all the available games a competitor can participate in
            MultiSelectList     gamesList           = new MultiSelectList(db.Games, "gameID", "gameName");
            CompetitorViewModel competitorViewModel = new CompetitorViewModel {
                AllGames = gamesList
            };

            ViewBag.countryList = GetCountries();
            ViewBag.titlesList  = GetTitles();
            ViewBag.genderList  = GetGenders();
            return(View(competitorViewModel));
        }
Пример #12
0
        // GET: Competitor/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            CompetitorViewModel competitor = _compService.FindById(id.Value);

            if (competitor == null)
            {
                return(HttpNotFound());
            }
            return(View(competitor));
        }
Пример #13
0
        public ActionResult EditCompetitor(CompetitorViewModel viewModel, string submitButton)
        {
            var competitor = viewModel.Map();

            switch (submitButton)
            {
            case "Save":
                _competitorService.UpdateCompetitor(competitor);
                break;

            case "Delete":
                _competitorService.DeleteCompetitor(competitor);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(submitButton));
            }

            return(RedirectToAction(nameof(CompetitorManagement)));
        }
        // GET: Competitors/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            CompetitorViewModel competitorViewModel = new CompetitorViewModel();

            competitorViewModel.Competitor = db.Competitors
                                             .Include(c => c.Games)
                                             .FirstOrDefault(c => c.competitorID == id);

            if (competitorViewModel.Competitor == null)
            {
                return(HttpNotFound());
            }

            var allGames = db.Games.ToList();

            competitorViewModel.Competitor.Games = allGames
                                                   .Where(g => g.Competitors
                                                          .Contains(competitorViewModel.Competitor))
                                                   .ToList();
            List <int> selectedGames = new List <int>();

            foreach (Game game in competitorViewModel.Competitor.Games)
            {
                selectedGames.Add(game.gameID);
            }

            // Populate the variables required for dropdown lists
            MultiSelectList gamesList = new MultiSelectList(allGames, "gameID", "gameName", selectedGames);

            competitorViewModel.AllGames = gamesList;
            ViewBag.countryList          = GetCountries();
            ViewBag.titlesList           = GetTitles();
            ViewBag.genderList           = GetGenders();

            return(View(competitorViewModel));
        }
        private void FillGridView()
        {
            var qtr              = Quater;
            var partnerId        = PartnerId;
            var CompetitorVMList = new List <CompetitorViewModel>();
            var Competitors      = _db.Competitors;

            foreach (var Competitor in Competitors)
            {
                var CompetitorsLi = _db.CompetitorLandscapes.FirstOrDefault(t => t.PartnerId == partnerId && t.QuarterYear == qtr && t.CategoryId == Competitor.CategoryId);

                if (CompetitorsLi == null)
                {
                    CompetitorsLi = new Data.Models.CompetitorLandscape();
                }

                var CompetitorVM = new CompetitorViewModel
                {
                    CompetitorId      = CompetitorsLi.CompetitorId,
                    Share             = CompetitorsLi.Share,
                    BrandPresenc      = CompetitorsLi.BrandPresenc,
                    PriceStrategy     = CompetitorsLi.PriceStrategy,
                    StoreInvestment   = CompetitorsLi.StoreInvestment,
                    AdditionalComment = CompetitorsLi.AdditionalComment,
                    PartnerId         = CompetitorsLi.PartnerId,
                    CategoryName      = Competitor.CategoryName,
                    CompetitorName    = Competitor.CompetitorName,
                    CompetitorLogo    = Competitor.CompetitorLogo,
                    CategoryId        = Competitor.CategoryId,
                    QuarterYear       = CompetitorsLi.QuarterYear
                };

                CompetitorVMList.Add(CompetitorVM);
            }
            GridView1.DataSource = CompetitorVMList;
            GridView1.DataBind();
            GridView1.UseAccessibleHeader    = true;
            GridView1.HeaderRow.TableSection = TableRowSection.TableHeader;
        }
Пример #16
0
        // GET: DH
        public ActionResult Index()
        {
            var viewModel = new DashboardViewModel();

            viewModel.Weeks.Add("Week 0");
            viewModel.Weeks.Add("Week 1");
            viewModel.Weeks.Add("Week 2");
            viewModel.Weeks.Add("Week 3");
            viewModel.Weeks.Add("Week 4");

            var filePath = @"c:\dh.xlsx";

            FileStream stream = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read);

            //2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
            IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

            //3. DataSet - The result of each spreadsheet will be created in the result.Tables
            DataSet result = excelReader.AsDataSet();

            //4. DataSet - Create column names from first row
            //excelReader.IsFirstRowAsColumnNames = true;
            //DataSet result = excelReader.AsDataSet();

            if (result != null)
            {
                viewModel.Competitors = new List<CompetitorViewModel>();

                for (int i = 2; i < result.Tables[0].Rows.Count; i++)
                {
                    var competitor = new CompetitorViewModel();

                    var row = result.Tables[0].Rows[i];

                    competitor.Name = row[0].ToString();
                    competitor.Activities = int.Parse(row[row.ItemArray.Length - 1].ToString());

                    competitor.WeekActivities.Add(0);
                    competitor.WeekActivities.Add(competitor.Activities);
                    competitor.WeekActivities.Add((competitor.Activities + i));
                    competitor.WeekActivities.Add((competitor.Activities + i + i));

                    viewModel.Competitors.Add(competitor);
                }

                //foreach (DataRow item in result.Tables[0].Rows)
                //{
                //	var competitor = new CompetitorViewModel();
                //	competitor.Name = item[0].ToString();

                //	competitors.Add(competitor);
                //}
            }

            ////5. Data Reader methods
            //while (excelReader.Read())
            //{

            //	var a = excelReader.GetInt32(0);
            //}

            //6. Free resources (IExcelDataReader is IDisposable)
            excelReader.Close();

            return View(viewModel);
        }
        public async Task <ActionResult> Edit(CompetitorViewModel competitorModel)
        {
            var selectedCompetitor = await _competitorService.Find(competitorModel.Id);

            var userId = Convert.ToInt32(User.Identity.Name);

            if (selectedCompetitor.IsApproved == null || selectedCompetitor.IsApproved == true)
            {
                var canEdit = await _participationService.CanEditPerson(selectedCompetitor.ParticipateId, userId);

                if (!canEdit)
                {
                    ModelState.AddModelError("", "شما امکان ویرایش اطلاعات بازیکن را ندارید.");
                    return(this.JsonValidationErrors());
                }
            }
            else
            {
                var canEdit = await _participationService.CanEditRejectedPerson(selectedCompetitor.ParticipateId, userId);

                if (!canEdit)
                {
                    ModelState.AddModelError("", "مهلت ویرایش اطلاعات بازیکن به پایان رسیده است.");
                    return(this.JsonValidationErrors());
                }
            }


            var tmpPath = Server.MapPath("~/App_Data/tmp/");

            var fullName = string.Format("{0}-{1}", competitorModel.FirstName, competitorModel.LastName).ApplyCorrectYeKe();

            if (selectedCompetitor.UserImage != competitorModel.UserImage)
            {
                var userImagePath = Server.MapPath("~/App_Data/User_Image/");

                await
                CopyFileAsync(tmpPath + competitorModel.UserImage,
                              userImagePath + string.Format("{0}-{1}", fullName, competitorModel.UserImage));

                System.IO.File.Delete(userImagePath + selectedCompetitor.UserImage);

                selectedCompetitor.UserImage = string.Format("{0}-{1}", fullName, competitorModel.UserImage);
            }

            if (selectedCompetitor.StudentCertificateImage != competitorModel.StudentCertificateImage)
            {
                var studentCertificateImagePath = Server.MapPath("~/App_Data/Student_Certificate_Image/");
                await
                CopyFileAsync(tmpPath + competitorModel.StudentCertificateImage,
                              studentCertificateImagePath +
                              string.Format("{0}-{1}", fullName, competitorModel.StudentCertificateImage));


                System.IO.File.Delete(studentCertificateImagePath + selectedCompetitor.StudentCertificateImage);


                selectedCompetitor.StudentCertificateImage = string.Format("{0}-{1}", fullName,
                                                                           competitorModel.StudentCertificateImage);
            }

            if (selectedCompetitor.InsuranceImage != competitorModel.InsuranceImage)
            {
                var insuranceImagePath = Server.MapPath("~/App_Data/Insurance_Image/");
                await
                CopyFileAsync(tmpPath + competitorModel.InsuranceImage,
                              insuranceImagePath + string.Format("{0}-{1}", fullName, competitorModel.InsuranceImage));


                System.IO.File.Delete(insuranceImagePath + selectedCompetitor.InsuranceImage);

                selectedCompetitor.InsuranceImage = string.Format("{0}-{1}", fullName, competitorModel.InsuranceImage);
            }

            if (selectedCompetitor.AzmoonConfirmationImage != competitorModel.AzmoonConfirmationImage)
            {
                var azmoonImagePath = Server.MapPath("~/App_Data/Azmoon_Confirmation_Image/");
                await
                CopyFileAsync(tmpPath + competitorModel.AzmoonConfirmationImage,
                              azmoonImagePath + string.Format("{0}-{1}", fullName, competitorModel.AzmoonConfirmationImage));

                System.IO.File.Delete(azmoonImagePath + selectedCompetitor.AzmoonConfirmationImage);

                selectedCompetitor.AzmoonConfirmationImage = string.Format("{0}-{1}", fullName,
                                                                           competitorModel.AzmoonConfirmationImage);
            }


            selectedCompetitor.FirstName          = competitorModel.FirstName;
            selectedCompetitor.LastName           = competitorModel.LastName;
            selectedCompetitor.InsuranceEndDate   = competitorModel.InsuranceEndDate;
            selectedCompetitor.StudyFieldId       = competitorModel.StudyFieldId;
            selectedCompetitor.StudyFieldDegreeId = competitorModel.StudyFieldDegreeId;
            selectedCompetitor.NationalCode       = competitorModel.NationalCode;
            selectedCompetitor.BirthDate          = competitorModel.BirthDate;
            selectedCompetitor.FatherName         = competitorModel.FatherName;
            selectedCompetitor.Email           = competitorModel.Email;
            selectedCompetitor.MobileNumber    = competitorModel.MobileNumber;
            selectedCompetitor.StudentNumber   = competitorModel.StudentNumber;
            selectedCompetitor.Weight          = competitorModel.Weight;
            selectedCompetitor.Height          = competitorModel.Height;
            selectedCompetitor.PhoneNumber     = competitorModel.PhoneNumber;
            selectedCompetitor.InsuranceNumber = competitorModel.InsuranceNumber;

            selectedCompetitor.IsApproved = null;

            await _dbContext.SaveChangesAsync();

            return(new HttpStatusCodeResult(HttpStatusCode.OK));
        }
Пример #18
0
        private List<CompetitorViewModel> generateViewModelResults(List<CompetitorAxware> competitorsRawResults, ref int maxNumberOfTimes)
        {
            maxNumberOfTimes = 0;
            string[] timesStr = new string[20];
            double[] times = new double[20];
            double[] overallCompetitorTimes = new double[competitorsRawResults.Count()];
            List<double> n2CompetitorTimes = new List<double>();
            List<double> n4CompetitorTimes = new List<double>();
            List<double> e2CompetitorTimes = new List<double>();
            List<double> e4CompetitorTimes = new List<double>();
            List<double> proCompetitorTimes = new List<double>();
            List<double> truckCompetitorTimes = new List<double>();

            // Container to hold calculated results, but unordered
            List<CompetitorViewModel> competitorsProcessedResults = new List<CompetitorViewModel>();
            int competitorIndex = 0;

            // First find how many runs each competitor have completed and find the maximum value;
            foreach (CompetitorAxware competitor in competitorsRawResults)
            {
                var timeList = new List<string> { competitor.Run1, competitor.Run2, competitor.Run3,competitor.Run4,competitor.Run5,competitor.Run6,competitor.Run7,competitor.Run8, competitor.Run9,competitor.Run10,competitor.Run11,
                    competitor.Run12,competitor.Run13,competitor.Run14,competitor.Run15,competitor.Run16,competitor.Run17,competitor.Run18,competitor.Run19,competitor.Run20 };
                var numberOfTimes = timeList.Count(k => k != "");
                if (numberOfTimes > maxNumberOfTimes)
                    maxNumberOfTimes = numberOfTimes;
            }


            // Calculate total time and position for each competitor
            foreach (CompetitorAxware competitor in competitorsRawResults)
            {
                var competitorViewModel = new CompetitorViewModel
                {
                    // Assign the basic properties
                    Car = competitor.Car,
                    Name = competitor.Name,
                    Class = competitor.Class,
                    Number = competitor.Number
                };

                if (maxNumberOfTimes > 0)
                {
                    var timeList = new List<string> { competitor.Run1, competitor.Run2, competitor.Run3,competitor.Run4,competitor.Run5,competitor.Run6,competitor.Run7,competitor.Run8, competitor.Run9,competitor.Run10,competitor.Run11,
                        competitor.Run12,competitor.Run13,competitor.Run14,competitor.Run15,competitor.Run16,competitor.Run17,competitor.Run18,competitor.Run19,competitor.Run20 };
                    var penaltyList = new List<string> { competitor.Pen1, competitor.Pen2, competitor.Pen3, competitor.Pen4, competitor.Pen5, competitor.Pen6, competitor.Pen7, competitor.Pen8, competitor.Pen9, competitor.Pen10,
                        competitor.Pen11, competitor.Pen12,competitor.Pen13, competitor.Pen14,competitor.Pen15, competitor.Pen16,competitor.Pen17, competitor.Pen18,competitor.Pen19, competitor.Pen20};

                    // Add times to an array
                    int i = 0;
                    foreach (var time in timeList)
                    {
                        timesStr[i] = time;
                        i++;
                    }

                    // Update time string with penalties (if applicable). Times over 300s or Off-course are capped
                    i = 0;
                    foreach (string penalty in penaltyList)
                    {
                        times[i] = singleTimeValidation(ref timesStr[i], penalty);
                        i++;
                    }

                    // Update view model with times + penalty
                    competitorViewModel.Time1 = timesStr[0];
                    competitorViewModel.Time2 = timesStr[1];
                    competitorViewModel.Time3 = timesStr[2];
                    competitorViewModel.Time4 = timesStr[3];
                    competitorViewModel.Time5 = timesStr[4];
                    competitorViewModel.Time6 = timesStr[5];
                    competitorViewModel.Time7 = timesStr[6];
                    competitorViewModel.Time8 = timesStr[7];
                    competitorViewModel.Time9 = timesStr[8];
                    competitorViewModel.Time10 = timesStr[9];
                    competitorViewModel.Time11 = timesStr[10];
                    competitorViewModel.Time12 = timesStr[11];
                    competitorViewModel.Time13 = timesStr[12];
                    competitorViewModel.Time14 = timesStr[13];
                    competitorViewModel.Time15 = timesStr[14];
                    competitorViewModel.Time16 = timesStr[15];
                    competitorViewModel.Time17 = timesStr[16];
                    competitorViewModel.Time18 = timesStr[17];
                    competitorViewModel.Time19 = timesStr[18];
                    competitorViewModel.Time20 = timesStr[19];

                    // If competitor has less timed runs than the maximum number of timed runs, add 300s to the missed runs
                    if (times.Count(k => k > 0) < maxNumberOfTimes)
                    {
                        for (int j = times.Count(k => k > 0); j < maxNumberOfTimes; j++)
                            times[j] = 300;
                    }

                    // Raw time (all summed up)
                    competitorViewModel.RawTime = times.Sum();
                    //Discard the slowest time if competitor has more than one timed run
                    if (maxNumberOfTimes > 1)
                        competitorViewModel.MinusSlowest = times.Sum() - times.Max();
                    else
                        competitorViewModel.MinusSlowest = times.Sum();

                    overallCompetitorTimes[competitorIndex] = competitorViewModel.MinusSlowest;
                    competitorViewModel.FastestLap = times.Where(f => f > 0).Min();
                }
                    switch (competitor.Class)
                    {
                        case CompetitionClass.n2:
                            n2CompetitorTimes.Add(competitorViewModel.MinusSlowest);
                            break;
                        case CompetitionClass.n4:
                            n4CompetitorTimes.Add(competitorViewModel.MinusSlowest);
                            break;
                        case CompetitionClass.e2:
                            e2CompetitorTimes.Add(competitorViewModel.MinusSlowest);
                            break;
                        case CompetitionClass.e4:
                            e4CompetitorTimes.Add(competitorViewModel.MinusSlowest);
                            break;
                        case CompetitionClass.pro:
                        case CompetitionClass.p2:
                        case CompetitionClass.p4:
                            proCompetitorTimes.Add(competitorViewModel.MinusSlowest);
                            break;
                        case CompetitionClass.truck:
                            truckCompetitorTimes.Add(competitorViewModel.MinusSlowest);
                            break;
                        default:
                            break;
                    }

                
                competitorsProcessedResults.Add(competitorViewModel);
                competitorIndex++;
            }

            // Find out what is the overall position for each competitor
            double[] n2CompetitorTimesArray = n2CompetitorTimes.ToArray();
            double[] n4CompetitorTimesArray = n4CompetitorTimes.ToArray();
            double[] e2CompetitorTimesArray = e2CompetitorTimes.ToArray();
            double[] e4CompetitorTimesArray = e4CompetitorTimes.ToArray();
            double[] proCompetitorTimesArray = proCompetitorTimes.ToArray();
            double[] truckCompetitorTimesArray = truckCompetitorTimes.ToArray();

            Array.Sort(overallCompetitorTimes);
            Array.Sort(n2CompetitorTimesArray);
            Array.Sort(n4CompetitorTimesArray);
            Array.Sort(e2CompetitorTimesArray);
            Array.Sort(e4CompetitorTimesArray);
            Array.Sort(proCompetitorTimesArray);
            Array.Sort(truckCompetitorTimesArray);

            foreach (var competitor in competitorsProcessedResults)
            {
                competitor.Overall = Array.IndexOf(overallCompetitorTimes, competitor.MinusSlowest) + 1;
                switch (competitor.Class)
                {
                    case CompetitionClass.n2:
                        competitor.InClass = Array.IndexOf(n2CompetitorTimesArray, competitor.MinusSlowest) + 1;
                        break;
                    case CompetitionClass.n4:
                        competitor.InClass = Array.IndexOf(n4CompetitorTimesArray, competitor.MinusSlowest) + 1;
                        break;
                    case CompetitionClass.e2:
                        competitor.InClass = Array.IndexOf(e2CompetitorTimesArray, competitor.MinusSlowest) + 1;
                        break;
                    case CompetitionClass.e4:
                        competitor.InClass = Array.IndexOf(e4CompetitorTimesArray, competitor.MinusSlowest) + 1;
                        break;
                    case CompetitionClass.pro:
                    case CompetitionClass.p2:
                    case CompetitionClass.p4:
                        competitor.InClass = Array.IndexOf(proCompetitorTimesArray, competitor.MinusSlowest) + 1;
                        break;
                    case CompetitionClass.truck:
                        competitor.InClass = Array.IndexOf(truckCompetitorTimesArray, competitor.MinusSlowest) + 1;
                        break;
                    default:
                        break;
                }
            }
            return competitorsProcessedResults.OrderBy(o => o.Overall).ToList();
        }
        public ActionResult Create(CompetitorViewModel competitorViewModel, HttpPostedFileBase competitorPhoto)
        {
            if (competitorPhoto != null)
            {
                // An array of allowed extensions
                var acceptedExtentions = new[] { ".png", ".jpg", ".jpeg", ".gif" };
                // Get extention of the file
                var fileExtension = Path.GetExtension(competitorPhoto.FileName).ToLower();
                if (!acceptedExtentions.Contains(fileExtension))
                {
                    ModelState.AddModelError(string.Empty, "File is not a valid type!");
                }
                // Check if the file has any content. A 0 byte file will return invalid to the view
                if (competitorPhoto.ContentLength < 1)
                {
                    ModelState.AddModelError("", "Error uploading file, file is empty or corrupt!");
                }
            }

            if (ModelState.IsValid)
            {
                // Populate competitor object with form data
                Competitor competitor = competitorViewModel.Competitor;
                // Convert email to lowercase
                competitor.competitorEmail = competitor.competitorEmail.ToLower();

                if (competitorViewModel.SelectedGames != null)
                {
                    foreach (var gameID in competitorViewModel.SelectedGames)
                    {
                        // Find the game by ID
                        Game game = db.Games.Find(gameID);
                        competitor.Games.Add(game);
                    }
                }

                if (competitorPhoto != null)
                {
                    var    fileExtension   = Path.GetExtension(competitorPhoto.FileName).ToLower();
                    string fileNamePattern = @"\s|[().,]";
                    var    fileName        = Regex.Replace(competitor.competitorName,
                                                           fileNamePattern, string.Empty)
                                             + fileExtension;
                    try
                    {
                        competitorPhoto.SaveAs(Path.Combine(HttpContext.Server.MapPath("~/Upload/Photos"), fileName));
                        competitor.competitorPhotoPath = "/Upload/Photos/" + fileName;
                    } catch
                    {
                        // Show an error if file couldn't be saved for whatever reason
                        // In a more traditional application the exception would be logged, however I am not doing that here
                        ModelState.AddModelError("", "File could not be saved, please contact the administrator!");
                    }
                }

                // Verify the ModelState remains valid (try-catch block above could change it)
                if (ModelState.IsValid)
                {
                    // Save changes to the DB
                    db.Competitors.Add(competitor);
                    db.SaveChanges();
                    return(RedirectToAction("Index"));
                }
            }

            // Repopulate the ViewBag/AllGames variables if the form is not valid and has to be re-displayed
            MultiSelectList gamesList = new MultiSelectList(db.Games, "gameID", "gameName");

            competitorViewModel.AllGames = gamesList;
            ViewBag.countryList          = GetCountries();
            ViewBag.titlesList           = GetTitles();
            ViewBag.genderList           = GetGenders();

            return(View(competitorViewModel));
        }
        public ActionResult Edit(CompetitorViewModel model, HttpPostedFileBase competitorPhoto)
        {
            if (competitorPhoto != null)
            {
                // An array of allowed extensions
                var acceptedExtentions = new[] { ".png", ".jpg", ".jpeg", ".gif" };
                var fileExtension      = Path.GetExtension(competitorPhoto.FileName).ToLower();
                if (!acceptedExtentions.Contains(fileExtension))
                {
                    ModelState.AddModelError(string.Empty, "File is not a valid type!");
                }
                // Check if the file has any content. A 0 byte file will return invalid to the view
                if (!(competitorPhoto.ContentLength > 0))
                {
                    ModelState.AddModelError("", "Error uploading file, file is empty or corrupt!");
                }
            }

            if (ModelState.IsValid)
            {
                // Source: http://stackoverflow.com/a/17819169
                // Retrieve the current data for this competitor, including current games
                Competitor competitor = db.Competitors
                                        .Include(c => c.Games)
                                        .SingleOrDefault(c => c.competitorID == model.Competitor.competitorID);

                // Populate the competitor object within the DB context with the POST data
                db.Entry(competitor).CurrentValues.SetValues(model.Competitor);
                // Convert email to lowercase for consistency
                competitor.competitorEmail = competitor.competitorEmail.ToLower();

                /* Compare the existing games for this competitor with the selected games
                 * and remove all games that are not in the SelectedGames list */
                competitor.Games.Where(g => !model.SelectedGames.Contains(g.gameID))
                .ToList()
                .ForEach(game => competitor.Games.Remove(game));

                foreach (int gameID in model.SelectedGames)
                {
                    if (!competitor.Games.Any(g => g.gameID == gameID))
                    {
                        Game addedGame = new Game {
                            gameID = gameID
                        };
                        // Attach the game to the current DbContext
                        db.Games.Attach(addedGame);
                        // Add the game to the competitor object
                        competitor.Games.Add(addedGame);
                    }
                }

                if (competitorPhoto != null)
                {
                    var    fileExtention   = Path.GetExtension(competitorPhoto.FileName).ToLower();
                    string fileNamePattern = @"\s|[().,]";
                    var    fileName        = Regex.Replace(competitor.competitorName,
                                                           fileNamePattern, string.Empty)
                                             + fileExtention;

                    try
                    {
                        if (competitor.competitorPhotoPath != null)
                        {
                            System.IO.File.Delete(HttpContext.Server.MapPath("~" + competitor.competitorPhotoPath));
                        }
                        competitorPhoto.SaveAs(Path.Combine(HttpContext.Server.MapPath("~/Upload/Photos"), fileName));
                        competitor.competitorPhotoPath = "/Upload/Photos/" + fileName;
                    }
                    catch
                    {
                        ModelState.AddModelError("", "File could not be saved, please contact the administrator!");
                    }
                }

                // Verify the ModelState remains valid (try-catch block above could change it)
                if (ModelState.IsValid)
                {
                    db.Entry(competitor).State = EntityState.Modified;
                    db.SaveChanges();
                    return(RedirectToAction("Index"));
                }
            }

            model.AllGames      = new MultiSelectList(db.Games, "gameID", "gameName", model.SelectedGames);
            ViewBag.countryList = GetCountries();
            ViewBag.titlesList  = GetTitles();
            ViewBag.genderList  = GetGenders();

            return(View(model));
        }