public ViewResult Parameters(int id, Terminal term) { _repository.UserName = User?.Identity?.Name; var groups = DbHelper.GetUserGroups(_repository.UserName, Constants.RightReadName); var terminal = _repository.GetTerminal(id); if (groups == null || terminal == null || (groups.Any() && groups.All(g => g.Id != terminal.IdGroup))) { return(View("Unauthorize")); } var result = false; var toUpdate = new Dictionary <Tuple <int, int>, TerminalParameter>(); foreach (var k in Request.Form.AllKeys) { if (k.StartsWith("all")) { var keyParts = k.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries); int idTerminal = int.Parse(keyParts[1]); int idParameter = int.Parse(keyParts[2]); var key = new Tuple <int, int>(idTerminal, idParameter); int idGroup = int.Parse(keyParts[3]); if (toUpdate.ContainsKey(key)) { var newVal = toUpdate[key]; newVal.ToAllGroups = true; toUpdate[key] = newVal; } else { var newPar = new TerminalParameter { IdTerminal = idTerminal, IdParameter = idParameter, IdGroupTerminal = idGroup, ToAllGroups = true, }; toUpdate.Add(key, newPar); } } else if (k.StartsWith("val")) { var keyParts = k.Split(new[] { '_' }, StringSplitOptions.RemoveEmptyEntries); int idTerminal = int.Parse(keyParts[1]); int idParameter = int.Parse(keyParts[2]); var key = new Tuple <int, int>(idTerminal, idParameter); int idGroup = int.Parse(keyParts[3]); if (toUpdate.ContainsKey(key)) { var newVal = toUpdate[key]; newVal.Value = Request.Form[k]; toUpdate[key] = newVal; } else { var newPar = new TerminalParameter { IdTerminal = idTerminal, IdParameter = idParameter, IdGroupTerminal = idGroup, Value = Request.Form[k] }; toUpdate.Add(key, newPar); } } } if (toUpdate.Values.Any(par => par.ToAllGroups)) { var terminal1 = terminal; var terminalsToUpd = _repository.Terminals.Where(t => t.IdGroup == terminal1.IdGroup && t.Id != id); var srcParams = toUpdate.Values.Where(par => par.ToAllGroups).ToArray(); foreach (var termToUpd in terminalsToUpd) { foreach (var parToUpd in srcParams.Select(tp => new TerminalParameter { IdParameter = tp.IdParameter, IdTerminal = termToUpd.Id, IdGroupTerminal = termToUpd.IdGroup, Value = tp.Value, ToAllGroups = tp.ToAllGroups, }) ) { toUpdate.Add(new Tuple <int, int>(parToUpd.IdTerminal, parToUpd.IdParameter), parToUpd); } } result = DbHelper.UpdateTerminalParameters(toUpdate.Values.Where(par => par.ToAllGroups), _repository.UserName); } else { result = true; } if (result && toUpdate.Values.Any(par => !par.ToAllGroups)) { var terminal1 = terminal; result = DbHelper.UpdateTerminalParameters( toUpdate.Values.Where(toUpdadePar => /*!string.IsNullOrWhiteSpace(toUpdadePar.Value) &&*/ !toUpdadePar.ToAllGroups && terminal1?.Parameters?.FirstOrDefault( termParam => termParam.Id == toUpdadePar.IdParameter)?.Value != toUpdadePar.Value) , _repository.UserName); } if (!result) { ModelState.AddModelError("Db", "Параметры терминала не были изменены! Повторите попытку или свяжитесь с администратором."); } terminal = _repository.GetTerminal(id); var parameters = DbHelper.GetAllParameters(terminal.IdGroup); var terminalsModel = new TerminalParametersViewModel { Parameters = parameters.Select(p => new Parameter { Id = p.Id, TId = terminal?.Id ?? 0,//terminal?.Parameters?.FirstOrDefault(tp => tp.Id == p.Id)?.TId ?? 0, Name = p.Name, Path = p.Path, Value = terminal?.Parameters?.FirstOrDefault(tp => tp.Id == p.Id)?.Value, SaveTime = terminal?.Parameters?.FirstOrDefault(tp => tp.Id == p.Id)?.SaveTime ?? DateTime.MinValue, LastEditTime = terminal?.Parameters?.FirstOrDefault(tp => tp.Id == p.Id)?.LastEditTime ?? DateTime.MinValue, Description = p.Description }), Terminal = new ViewTerminal(terminal) { GroupsIdsString = terminal.IdGroup.ToString(), GroupsNamesString = terminal.Group?.Name } }; ViewBag.CanEdit = DbHelper.UserIsAdmin(User?.Identity?.Name) || DbHelper.UserInRole(User?.Identity?.Name, Constants.RightWriteName, terminal.IdGroup) || DbHelper.UserInRole(User?.Identity?.Name, Constants.RightWriteName, null); return(View(terminalsModel)); }