/// <summary>
        /// Сохраняет настройки из объекта настроек <paramref name="configuration"/> и немедленно применяет их к модулю.
        /// </summary>
        /// <returns>Возвращает кортеж из двух значений - результат сохранения и идентификатор записи журнала в случае ошибки.</returns>
        /// <seealso cref="Journaling.JournalingManager.GetJournalData(int)"/>
        public (ApplyConfigurationResult, int?) ApplyConfiguration <TConfiguration>(TConfiguration configuration)
            where TConfiguration : ModuleConfiguration <TModule>, new()
        {
            try
            {
                var eventArgs = new ConfigurationApplyEventArgs <TModule>(configuration);
                _module.OnConfigurationApply(eventArgs);

                if (eventArgs.IsSuccess)
                {
                    var result = AppCore.GetModulesManager().ApplyModuleConfiguration(configuration, this, _module);
                    if (result == ApplyConfigurationResult.Success)
                    {
                        try { _module.OnConfigurationApplied(); } catch { }
                    }
                    return(result, null);
                }
                else
                {
                    return(ApplyConfigurationResult.Failed, eventArgs.IdJournalData);
                }
            }
            catch (Exception ex)
            {
                return(ApplyConfigurationResult.Failed, _module.RegisterEvent(Journaling.EventType.Error, "Ошибка сохранения настроек", null, ex).Result);
            }
        }
Beispiel #2
0
        public virtual ActionResult MainSettings()
        {
            var handler = AppCore.Get <ModuleControllerTypesManager>();
            var model   = new Model.AdminMainModelInfoPage(AppCore.AppConfig, AppCore.WebConfig)
            {
                ModulesList = (from p in AppCore.GetModulesManager().GetModules()
                               where handler.GetModuleControllerTypes(p.QueryType) != null
                               orderby p.Caption
                               select new SelectListItem()
                {
                    Value = p.ID.ToString(),
                    Text = p.Caption,
                    Selected = AppCore.WebConfig.IdModuleDefault == p.ID
                }).ToList()
            };

            using (var db = Module.CreateUnitOfWork())
            {
                model.Roles = (from p in db.Role orderby p.NameRole ascending select p).ToList();
                model.Roles.Insert(0, new Role()
                {
                    IdRole = 0, NameRole = "Не выбрано"
                });
            }

            return(View("CoreSettings.tpl", model));
        }
Beispiel #3
0
        private void Execute()
        {
            try
            {
                var sitemapProviderTypes = AppCore.GetQueryTypes().Where(x => typeof(ISitemapProvider).IsAssignableFrom(x)).ToList();
                var providerList         = sitemapProviderTypes.Select(x =>
                {
                    try
                    {
                        return(AppCore.Create <ISitemapProvider>(x));
                    }
                    catch
                    {
                        return(null);
                    }
                }).Where(x => x != null).ToList();
                var linksAll = providerList.SelectMany(x => x.GetItems() ?? new List <SitemapItem>()).ToList();

                var module = AppCore.GetModulesManager().GetModule <ModuleSitemap>();

                var code = WebUtils.RazorRenderHelper.RenderView(module, "SitemapXml.cshtml", linksAll);

                var path = System.IO.Path.Combine(OnUtils.LibraryEnumeratorFactory.LibraryDirectory, "data/sitemap.xml");
                System.IO.File.WriteAllText(path, code);
            }
            catch (Exception ex)
            {
                this.RegisterEvent(Journaling.EventType.CriticalError, "Ошибка построения карты сайта", null, ex);
            }
        }
Beispiel #4
0
        public virtual ActionResult Routing()
        {
            var model = new Model.Routing()
            {
                Modules = AppCore.GetModulesManager().GetModules().OfType <IModuleCore>().OrderBy(x => x.Caption).ToList()
            };

            using (var db = new Modules.Routing.Db.DataContext())
            {
                //test group
                var modulesIdList = model.Modules.Select(x => x.IdModule).ToArray();
                var query         = db.Routing
                                    .Where(x => modulesIdList.Contains(x.IdModule))
                                    .GroupBy(x => new { x.IdModule, x.IdRoutingType })
                                    .Select(x => new { x.Key.IdModule, x.Key.IdRoutingType, Count = x.Count() })
                                    .GroupBy(x => x.IdRoutingType)
                                    .ToDictionary(x => x.Key, x => x.ToDictionary(y => y.IdModule, y => y.Count))
                ;

                var query2 = (new RoutingType[] { RoutingType.Main, RoutingType.Additional, RoutingType.Old })
                             .ToDictionary(x => x,
                                           x => model.Modules.ToDictionary(y => y.IdModule,
                                                                           y => query.ContainsKey(x) && query[x].ContainsKey(y.IdModule) ? query[x][y.IdModule] : 0));

                model.RoutesMain       = query2[RoutingType.Main];
                model.RoutesAdditional = query2[RoutingType.Additional];
                model.RoutesOld        = query2[RoutingType.Old];
            }

            return(View("routing.cshtml", model));
        }
Beispiel #5
0
        /// <summary>
        /// Устанавливает в качестве системного языковой пакет <paramref name="language"/>.
        /// </summary>
        /// <returns>Возвращает true, если языковой пакет был успешно указан в качестве активного, либо false в случае ошибки.</returns>
        /// <exception cref="ArgumentNullException">Возникает, если <paramref name="language"/> равен null.</exception>
        public Types.ConfigurationSaveResult SetSystemLanguage(Language language)
        {
            if (language == null)
            {
                throw new ArgumentNullException(nameof(language));
            }

            try
            {
                var module = AppCore.GetModulesManager().GetModule <CoreModule <WebApplication> >();
                var cfg    = module.GetConfigurationManipulator().GetEditable <CoreConfiguration <WebApplication> >();
                cfg.IdSystemLanguage = language.IdLanguage;

                switch (module.GetConfigurationManipulator().ApplyConfiguration(cfg).Item1)
                {
                case ApplyConfigurationResult.PermissionDenied:
                    return(Types.ConfigurationSaveResult.PermissionsDenied);

                case ApplyConfigurationResult.Success:
                    return(Types.ConfigurationSaveResult.Success);

                default:
                    return(Types.ConfigurationSaveResult.UnknownError);
                }
            }
            catch (Exception ex)
            {
                this.RegisterEvent(EventType.Error, "Ошибка при сохранении активного системного языкового пакета", null, null, ex);
                return(Types.ConfigurationSaveResult.UnknownError);
            }
        }
Beispiel #6
0
        public JsonResult SchemeAdd(int?idModule = null, string schemeName = null)
        {
            var result = JsonAnswer <uint>();

            try
            {
                if (!idModule.HasValue)
                {
                    throw new Exception("Не указан идентификатор модуля.");
                }

                var module = AppCore.GetModulesManager().GetModule(idModule.Value) as IModuleCore;
                if (module == null)
                {
                    throw new Exception("Модуль не найден.");
                }

                if (Request.Form.HasKey(nameof(schemeName)))
                {
                    schemeName = Request.Form[nameof(schemeName)];
                }

                if (string.IsNullOrEmpty(schemeName))
                {
                    result.Message = "Не указано название схемы!";
                }
                else if (!schemeName.isOneStringTextOnly())
                {
                    result.Message = "Некорректно указано название схемы!";
                }
                else
                {
                    using (var db = this.CreateUnitOfWork())
                    {
                        var data = new CustomFieldsScheme()
                        {
                            IdModule   = idModule.Value,
                            NameScheme = schemeName
                        };
                        db.CustomFieldsSchemes.Add(data);

                        if (db.SaveChanges() > 0)
                        {
                            result.Message = "Схема добавлена.";
                            result.Success = true;
                            result.Data    = (uint)data.IdScheme;
                            AppCore.Get <ModuleItemsCustomize <WebApplication> >().UpdateCache();
                        }
                        else
                        {
                            result.Message = "По неизвестной причине схему не получилось добавить.";
                        }
                    }
                }
            }
            catch (Exception ex) { result.Message = ex.Message; }

            return(ReturnJson(result));
        }
Beispiel #7
0
        public virtual ActionResult RoutingModule(int IdModule)
        {
            if (IdModule <= 0)
            {
                throw new Exception("Не указан идентификатор модуля.");
            }
            var module = AppCore.GetModulesManager().GetModule(IdModule);

            if (module == null)
            {
                throw new Exception($"Не получилось найти модуль с указанным идентификатором {IdModule}.");
            }

            var model = new Model.RoutingModule()
            {
                Module = (IModuleCore)module
            };

            var moduleActionAttributeType  = typeof(ModuleActionAttribute);
            var moduleActionGetDisplayName = new Func <ActionDescriptor, string>(action =>
            {
                var attr = action.GetCustomAttributes(moduleActionAttributeType, true).OfType <ModuleActionAttribute>().FirstOrDefault();
                if (attr != null)
                {
                    if (!string.IsNullOrEmpty(attr.Caption))
                    {
                        return(attr.Caption);
                    }
                }

                return(action.ActionName);
            });

            var modulesActions = AppCore.GetModulesManager().GetModules().OfType <IModuleCore>().Select(x => new
            {
                Module          = x,
                UserDescriptor  = x.ControllerUser() != null ? new ReflectedControllerDescriptor(x.ControllerUser()) : null,
                AdminDescriptor = x.ControllerAdmin() != null ? new ReflectedControllerDescriptor(x.ControllerAdmin()) : null,
            }).Select(x => new
            {
                x.Module,
                UserActions  = x.UserDescriptor != null ? x.UserDescriptor.GetCanonicalActions().Where(y => y.IsDefined(moduleActionAttributeType, true)).ToDictionary(y => y.ActionName, y => "Общее: " + moduleActionGetDisplayName(y)) : new Dictionary <string, string>(),
                AdminActions = x.AdminDescriptor != null ? x.AdminDescriptor.GetCanonicalActions().Where(y => y.IsDefined(moduleActionAttributeType, true)).ToDictionary(y => y.ActionName, y => "Администрирование: " + moduleActionGetDisplayName(y)) : new Dictionary <string, string>(),
            }).ToDictionary(x => x.Module, x => x.UserActions.Union(x.AdminActions).OrderBy(y => y.Value).ToDictionary(y => y.Key, y => y.Value));

            model.ModulesActions = modulesActions.
                                   Select(x => new { Group = new SelectListGroup()
                                                     {
                                                         Name = x.Key.Caption
                                                     }, Items = x.Value, Module = x.Key }).
                                   SelectMany(x => x.Items.Select(y => new SelectListItem()
            {
                Text = y.Value, Value = $"{x.Module.IdModule}_{y.Key}", Group = x.Group
            })).ToList();

            return(View("routing_module.cshtml", model));
        }
        /// <summary>
        /// Возвращает объект типа <typeparamref name="TConfiguration"/>, содержащий настройки модуля <typeparamref name="TModule"/>.
        /// Изменение значений настроек в возвращенном объекте не влияет на непосредственно используемые в работе приложения значения. Для применения измененных значений см. <see cref="ApplyConfiguration{TConfiguration}(TConfiguration)"/>.
        /// </summary>
        /// <exception cref="InvalidOperationException">Возникает, если модуль <typeparamref name="TModule"/> не найден.</exception>
        public TConfiguration GetEditable <TConfiguration>() where TConfiguration : ModuleConfiguration <TModule>, new()
        {
            var valuesProviderUsable = AppCore.GetModulesManager().CreateValuesProviderForModule(_module);

            var configuration = new TConfiguration()
            {
                _isReadonly = false, _valuesProvider = valuesProviderUsable
            };

            return(configuration);
        }
Beispiel #9
0
        public ActionResult ModulesList()
        {
            var model = new Model.Modules()
            {
                //Unregistered = (from p in AppCore.GetModulesManager().getModulesCandidates()
                //                orderby p.Key.Info.ModuleCaption
                //                select new Model.ModuleUnregistered(p.Key) { Info = p.Value }).ToList(),
                Registered = (from p in AppCore.GetModulesManager().GetModules().OfType <IModuleCore>()
                              orderby p.Caption
                              select new Model.Module(p)).ToList()
            };

            return(View("Modules.cshtml", model));
        }
        /// <summary>
        /// Возвращает объект типа <typeparamref name="TConfiguration"/>, содержащий параметры модуля <typeparamref name="TModule"/>.
        /// Возвращенный объект находится в режиме "только для чтения" - изменение параметров невозможно, попытка выполнить set вызовет <see cref="InvalidOperationException"/>.
        /// Все объекты конфигурации, созданные путем вызова этого метода, манипулируют одним набором значений.
        /// То есть после изменения конфигурации путем вызова <see cref="ApplyConfiguration{TConfiguration}(TConfiguration)"/> новые значения автоматически доступны во всех ранее созданных в данном методе экземплярах конфигурации.
        /// </summary>
        /// <exception cref="InvalidOperationException">Возникает, если модуль <typeparamref name="TModule"/> не найден.</exception>
        public TConfiguration GetUsable <TConfiguration>() where TConfiguration : ModuleConfiguration <TModule>, new()
        {
            if (_valuesProviderUsable == null)
            {
                _valuesProviderUsable = AppCore.GetModulesManager().CreateValuesProviderForModule(_module);
            }

            var configuration = new TConfiguration()
            {
                _isReadonly = true, _valuesProvider = _valuesProviderUsable
            };

            return(configuration);
        }
Beispiel #11
0
        public JsonResult FieldDelete(int IdField = 0)
        {
            var result = Controller.JsonAnswer();

            try
            {
                using (var db = this.CreateUnitOfWork())
                {
                    var data = db.CustomFieldsFields.Where(x => x.IdField == IdField).Include(x => x.data).FirstOrDefault();
                    if (data == null)
                    {
                        throw new Exception("Такое поле не найдено в базе данных!");
                    }
                    if (data.IdModule != this.Module.ID)
                    {
                        var module = AppCore.GetModulesManager().GetModule(data.IdModule);
                        if (module == null)
                        {
                            throw new Exception("Это поле относится к другому модулю.");
                        }
                        else
                        {
                            throw new Exception(string.Format("Это поле относится к модулю '{0}'.", module.Caption));
                        }
                    }

                    using (var scope = db.CreateScope())
                    {
                        db.DeleteEntity(data);
                        if (db.SaveChanges <CustomFieldsField>() > 0)
                        {
                            db.CustomFieldsValues.Where(x => x.IdField == data.IdField).Delete();
                            db.CustomFieldsDatas.Where(x => x.IdField == data.IdField).Delete();

                            result.Message = "Удаление поля прошло успешно.";
                            result.Success = true;

                            scope.Commit();
                        }
                        else
                        {
                            throw new Exception("Не получилось удалить поле.");
                        }
                    }
                }
            }
            catch (Exception ex) { result.Message = ex.Message; }

            return(Controller.ReturnJson(result));
        }
Beispiel #12
0
        public ActionResult FieldEdit(int?idModule = null, int idField = 0)
        {
            if (!idModule.HasValue)
            {
                throw new Exception("Не указан идентификатор модуля.");
            }

            var module = AppCore.GetModulesManager().GetModule(idModule.Value) as IModuleCore;

            if (module == null)
            {
                throw new Exception("Модуль не найден.");
            }

            CustomFieldsField data = null;

            if (idField > 0)
            {
                using (var db = this.CreateUnitOfWork())
                {
                    data = db.CustomFieldsFields.Where(x => x.IdField == idField).Include(x => x.data).FirstOrDefault();
                    if (data == null)
                    {
                        throw new Exception("Такое поле не найдено в базе данных!");
                    }
                    if (data.IdModule != idModule.Value)
                    {
                        var module2 = AppCore.GetModulesManager().GetModule(data.IdModule);
                        if (module2 == null)
                        {
                            throw new Exception("Это поле относится к другому модулю.");
                        }
                        else
                        {
                            throw new Exception(string.Format("Это поле относится к модулю '{0}'.", module2.Caption));
                        }
                    }
                }
            }
            else
            {
                data = new CustomFieldsField()
                {
                    IdFieldType = 0, IdModule = idModule.Value
                };
            }

            return(View("FieldEdit.cshtml", new FieldEdit(data)));
        }
Beispiel #13
0
        public virtual ActionResult RolesManage()
        {
            var model = new Model.AdminRolesManage();

            using (var db = this.CreateUnitOfWork())
            {
                var perms = (from p in db.RolePermission
                             group p by p.IdRole into gr
                             select new { gr.Key, gr })
                            .ToDictionary(x => x.Key,
                                          x => x.gr.Select(p => string.Format("{0};{1}", p.IdModule, p.Permission)).ToList());


                model.Roles = db.Role
                              .OrderBy(x => x.NameRole)
                              .ToDictionary(x => x.IdRole,
                                            x => new Model.AdminRoleEdit(x)
                {
                    Permissions = perms.ContainsKey(x.IdRole) ? perms[x.IdRole] : new List <string>()
                });

                var mperms = new List <SelectListItem>();
                foreach (var module in AppCore.GetModulesManager().GetModules().OrderBy(x => x.Caption))
                {
                    var gr = new SelectListGroup()
                    {
                        Name = module.Caption
                    };
                    if (!(module is Admin.ModuleAdmin))
                    {
                        mperms.Add(new SelectListItem()
                        {
                            Group = gr,
                            Value = string.Format("{0};{1}", module.ID, ModulesConstants.PermissionManage),
                            Text  = "Администрирование: Управление модулем"
                        });
                    }

                    mperms.AddRange(module.GetPermissions().OrderBy(x => x.Caption).Select(x => new SelectListItem()
                    {
                        Group = gr,
                        Value = string.Format("{0};{1}", module.ID, x.Key),
                        Text  = x.Caption
                    }));
                }
                model.ModulesPermissions = mperms;
            }
            return(View("admin/admin_customer_rolesManage.cshtml", model));
        }
Beispiel #14
0
        /// <summary>
        /// См. <see cref="CheckPermissions(IModuleCore, RouteValueDictionary)"/>.
        /// </summary>
        public override bool CheckPermissions(IModuleCore module, RouteValueDictionary routeValues)
        {
            //Проверка доступа к саму панель управления. Нет прав на модуле "Admin".
            var moduleAdmin = AppCore.GetModulesManager().GetModule <Modules.Admin.ModuleAdmin>();

            if (moduleAdmin != null)
            {
                if (moduleAdmin.CheckPermission(ModulesConstants.PermissionManage) != CheckPermissionVariant.Allowed)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #15
0
        NestedLinkCollection IMenuProvider.GetModuleAdminMenuLinks()
        {
            var moduleAdmin = AppCore.Get <Admin.ModuleAdmin>();

            var modules = AppCore.
                          GetModulesManager().
                          GetModules().
                          OfType <IModuleCore>().
                          OrderBy(x => x.Caption).
                          Select(x => new NestedLinkSimple(x.Caption, new Uri($"/{moduleAdmin.UrlName}/mnadmin/{UrlName}/FieldsList/{x.IdModule}", UriKind.Relative))).
                          ToList();

            var collection = new NestedLinkCollection(new NestedLinkGroup("В модулях", modules.ToArray()));

            return(collection);
        }
Beispiel #16
0
        public ActionResult EditableMenuEdit(int IdMenu = 0)
        {
            using (var db = new Db.DataContext())
            {
                var menu = IdMenu == 0 ? new Db.Menu() : db.Menu.Where(x => x.id == IdMenu).FirstOrDefault();
                if (menu == null)
                {
                    throw new Exception(string.Format("Меню с id={0} не найдено.", IdMenu));
                }

                return(View("EditableMenuEdit.cshtml", new Design.Model.EditableMenu()
                {
                    Menu = menu,
                    Modules = AppCore.GetModulesManager().GetModules().OfType <IModuleCore>().OrderBy(x => x.Caption).ToList()
                }));
            }
        }
        public virtual ActionResult RolesManage()
        {
            var model = new Model.AdminRolesManage();

            using (var db = new CoreContext())
            {
                var permsQuery = (from p in db.RolePermission
                                  select new { p.IdRole, p.IdModule, p.Permission }
                                  ).Distinct();

                var perms = permsQuery.
                            ToList().
                            GroupBy(x => x.IdRole).
                            ToDictionary(x => x.Key,
                                         x => x.Select(p => string.Format("{0};{1}", p.IdModule, p.Permission)).ToList());


                model.Roles = db.Role
                              .OrderBy(x => x.NameRole)
                              .ToDictionary(x => x.IdRole,
                                            x => new Model.AdminRoleEdit(x)
                {
                    Permissions = perms.ContainsKey(x.IdRole) ? perms[x.IdRole] : new List <string>()
                });

                var mperms = new List <SelectListItem>();
                foreach (var module in AppCore.GetModulesManager().GetModules().OrderBy(x => x.Caption))
                {
                    var gr = new SelectListGroup()
                    {
                        Name = module.Caption
                    };
                    mperms.AddRange(module.GetPermissions().OrderBy(x => x.Caption).Select(x => new SelectListItem()
                    {
                        Group = gr,
                        Value = string.Format("{0};{1}", module.ID, x.Key),
                        Text  = x.Caption
                    }));
                }
                model.ModulesPermissions = mperms;
            }
            return(View("admin/admin_customer_rolesManage.cshtml", model));
        }
Beispiel #18
0
        /// <summary>
        /// Возвращает список контейнеров схем, зарегистрированных для текущего модуля.
        /// </summary>
        public Dictionary <ItemType, Dictionary <SchemeItem, string> > GetSchemeItemsList(int idModule)
        {
            var itemsGroups = new Dictionary <ItemType, Dictionary <SchemeItem, string> >();
            var module      = AppCore.GetModulesManager().GetModule(idModule) as IModuleCore;

            if (module == null)
            {
                return(null);
            }

            foreach (var itemType in module.GetItemTypes())
            {
                var items = new Dictionary <SchemeItem, string>();

                var _itemsPre = module.GetItems(itemType.IdItemType);
                var _items    = _itemsPre != null?_itemsPre.GetSimplifiedHierarchy() : new NestedCollectionSimplified();

                if (_items != null && _items.Count() > 0)
                {
                    foreach (var res in _items)
                    {
                        items[new SchemeItem(res.Key.ID, itemType.IdItemType)] = res.Value;
                    }
                }
                else
                {
                    items[new SchemeItem(0, itemType.IdItemType)] = "По-умолчанию";
                }

                if (!items.Any(x => x.Key.IdItem == 0 && x.Key.IdItemType == itemType.IdItemType))
                {
                    var items2 = new Dictionary <SchemeItem, string>();
                    items2[new SchemeItem(0, itemType.IdItemType)] = "По-умолчанию";
                    items.ForEach(x => items2.Add(x.Key, x.Value));
                    items = items2;
                }

                itemsGroups[itemType] = items;
            }

            return(itemsGroups);
        }
Beispiel #19
0
        /// <summary>
        /// См. <see cref="ModuleAdmin.GetAdminMenuList(IUserContext)"/>.
        /// </summary>
        public override Dictionary <IModuleCore, NestedLinkCollection> GetAdminMenuList(IUserContext userContext)
        {
            var modulesList = AppCore.GetModulesManager().GetModules().OfType <IModuleCore>();
            var mods        = new Dictionary <IModuleCore, NestedLinkCollection>();
            var mods_errors = new Dictionary <IModuleCore, string>();

            foreach (var module in modulesList)
            {
                if (module.CheckPermission(userContext, ModulesConstants.PermissionManage) != CheckPermissionVariant.Allowed)
                {
                    mods_errors[module] = "Недостаточно прав";
                }
                else
                {
                    var links = module.GetAdminMenuItems();
                    if (links == null)
                    {
                        links = new NestedLinkCollection();
                    }

                    if (links.Count > 0)
                    {
                        if (module.CheckPermission(userContext, ModulesConstants.PermissionManage) == CheckPermissionVariant.Allowed)
                        {
                            mods[module] = links;
                        }
                        else
                        {
                            mods_errors[module] = "Недостаточно прав";
                        }
                    }
                }
            }

            var model = new Dictionary <IModuleCore, NestedLinkCollection>();

            mods.Where(x => x.Value.Count > 0).OrderBy(x => x.Key.Caption).ForEach(x => model[x.Key] = x.Value);
            mods_errors.OrderBy(x => x.Key.Caption).ForEach(x => model[x.Key].Add(new NestedLinkSimple(x.Value)));

            return(model);
        }
Beispiel #20
0
        public ActionResult UploadFile(string moduleName = null, string uniqueKey = null)
        {
            var result = JsonAnswer <int>();

            try
            {
                if (!string.IsNullOrEmpty(uniqueKey) && uniqueKey.Length > 255)
                {
                    throw new ArgumentOutOfRangeException(nameof(uniqueKey), "Длина уникального ключа не может быть больше 255 символов.");
                }
                if (string.IsNullOrEmpty(moduleName))
                {
                    throw new ArgumentNullException(nameof(moduleName), "Не указан модуль, для которого загружается файл.");
                }

                var module = AppCore.GetModulesManager().GetModule(moduleName) ?? (int.TryParse(moduleName, out int idModule) ? AppCore.GetModulesManager().GetModule(idModule) : null);
                if (module == null)
                {
                    throw new Exception("Указанный модуль не найден.");
                }

                var hpf = HttpContext.Request.Files["file"] as HttpPostedFileBase;
                if (hpf == null)
                {
                    throw new ArgumentNullException("Не найден загружаемый файл.");
                }

                var rootDirectory    = System.Web.Hosting.HostingEnvironment.MapPath("/");
                var filePathRelative = Path.Combine("data/filesClosed/", Guid.NewGuid().ToString() + Path.GetExtension(hpf.FileName));
                var filePath         = Path.Combine(rootDirectory, filePathRelative);
                Directory.CreateDirectory(Path.GetDirectoryName(filePath));

                hpf.SaveAs(filePath);
                switch (Module.Register(out var file, hpf.FileName, filePathRelative, uniqueKey, DateTime.Now.AddDays(1)))
                {
                case RegisterResult.Error:
                case RegisterResult.NotFound:
                    result.FromFail("Не удалось зарегистрировать переданный файл.");
                    break;
Beispiel #21
0
        public ActionResult FieldsList(int?idModule = null)
        {
            if (!idModule.HasValue)
            {
                throw new Exception("Не указан идентификатор модуля.");
            }

            var module = AppCore.GetModulesManager().GetModule(idModule.Value) as IModuleCore;

            if (module == null)
            {
                throw new Exception("Модуль не найден.");
            }

            AppCore.Get <ModuleItemsCustomize <WebApplication> >().UpdateCache();

            var schemes     = Module.GetSchemeList(idModule.Value);
            var schemeItems = Module.GetSchemeItemsList(idModule.Value);

            var id = idModule.Value;

            using (var db = this.CreateUnitOfWork())
            {
                var fields = (from p in db.CustomFieldsFields
                              where p.Block == 0 && p.IdModule == id
                              orderby p.name
                              select p).ToDictionary(x => x.IdField, x => x as IField);

                return(View("SchemesEdit.cshtml", new Fields
                {
                    IdModule = idModule.Value,
                    FieldsList = fields,
                    SchemeItems = schemeItems,
                    Schemes = schemes,
                    AllowSchemesManage = Module.CheckPermission(ModuleItemsCustomize <WebApplication> .PERM_EXTFIELDS_ALLOWMANAGE) == CheckPermissionResult.Allowed
                }));
            }
        }
Beispiel #22
0
        public JsonResult EditableMenuLinks(int?idModule = 0)
        {
            var    success = false;
            var    result  = "";
            object data    = null;

            try
            {
                if (!idModule.HasValue || idModule == 0)
                {
                    throw new Exception("Не указан модуль, для которого необходимо получить список ссылок.");
                }

                var module = (IModuleCore)AppCore.GetModulesManager().GetModule(idModule.Value);
                if (module == null)
                {
                    throw new Exception("Не удалось найти указанный модуль.");
                }

                var itemsAll = module.GetItemTypes().
                               SelectMany(x => module.GetItems(x.IdItemType)).
                               OfType <IItemRouted>().
                               OrderBy(x => x.Caption).
                               ToDictionary(x => x.Url.ToString(), x => x.Caption);


                data = itemsAll;

                success = true;
            }
            catch (Exception ex)
            {
                success = false;
                result  = ex.Message;
            }

            return(ReturnJson(success, result, data));
        }
Beispiel #23
0
        public ActionResult FieldEdit(int IdField = 0)
        {
            CustomFieldsField data = null;

            if (IdField > 0)
            {
                using (var db = this.CreateUnitOfWork())
                {
                    data = db.CustomFieldsFields.Where(x => x.IdField == IdField).Include(x => x.data).FirstOrDefault();
                    if (data == null)
                    {
                        throw new Exception("Такое поле не найдено в базе данных!");
                    }
                    if (data.IdModule != this.Module.ID)
                    {
                        var module = AppCore.GetModulesManager().GetModule(data.IdModule);
                        if (module == null)
                        {
                            throw new Exception("Это поле относится к другому модулю.");
                        }
                        else
                        {
                            throw new Exception(string.Format("Это поле относится к модулю '{0}'.", module.Caption));
                        }
                    }
                }
            }
            else
            {
                data = new DB.CustomFieldsField()
                {
                    IdFieldType = 0, IdModule = this.Module.ID
                };
            }

            return(Controller.display("ModuleExtensions/CustomFields/Design/FieldEdit.cshtml", new Model.FieldEdit(data)));
        }
Beispiel #24
0
        public virtual ActionResult MainSettings()
        {
            var handler = AppCore.Get <ModuleControllerTypesManager>();
            var model   = new ViewModels.MainSettings(AppCore.AppConfig, AppCore.WebConfig);

            model.Modules = AppCore.GetModulesManager().GetModules().
                            Where(x => handler.GetModuleControllerTypes(x.QueryType) != null).
                            Select(x => new ViewModels.MainSettingsModule()
            {
                Id = x.IdModule, Caption = x.Caption
            }).
                            ToList();

            using (var db = new DataContext())
            {
                model.Roles = db.Role.Where(x => !x.IsHidden || x.IdRole == AppCore.AppConfig.RoleGuest || x.IdRole == AppCore.AppConfig.RoleUser).ToList();
                model.Roles.Insert(0, new Role()
                {
                    IdRole = 0, NameRole = "Не выбрано", IsHidden = false
                });
            }

            return(View("MainSettings.tpl", model));
        }
Beispiel #25
0
        private void ExecuteInternal()
        {
            if (_isExecuting)
            {
                return;
            }
            try
            {
                _isExecuting = true;

                var sitemapProviderTypes = AppCore.GetQueryTypes().Where(x => typeof(ISitemapProvider).IsAssignableFrom(x)).ToList();
                var providerList         = sitemapProviderTypes.Select(x =>
                {
                    try
                    {
                        return(AppCore.Create <ISitemapProvider>(x));
                    }
                    catch
                    {
                        return(null);
                    }
                }).Where(x => x != null).ToList();
                var linksAll = providerList.SelectMany(x => x.GetItems() ?? new List <SitemapItem>()).ToList();

                var module = AppCore.GetModulesManager().GetModule <ModuleSitemap>();

                var code = WebUtils.RazorRenderHelper.RenderView(module, "SitemapXml.cshtml", linksAll);

                var path = System.IO.Path.Combine(OnUtils.LibraryEnumeratorFactory.LibraryDirectory, "sitemap.xml");
                System.IO.File.WriteAllText(path, code);
            }
            finally
            {
                _isExecuting = false;
            }
        }
Beispiel #26
0
        public virtual JsonResult MainSettingsSave(Model.MainSettingsSave model)
        {
            var result = JsonAnswer();
            CoreConfiguration    cfgAppOld = null;
            WebCoreConfiguration cfgWebOld = null;

            try
            {
                if (ModelState.IsValid)
                {
                    cfgAppOld = AppCore.AppCoreModule.GetConfigurationManipulator().GetEditable <CoreConfiguration>();
                    cfgWebOld = AppCore.GetModulesManager().GetModule <WebCoreModule>().GetConfigurationManipulator().GetEditable <WebCoreConfiguration>();

                    var cfgApp = AppCore.GetModulesManager().GetModule <CoreModule>().GetConfigurationManipulator().GetEditable <CoreConfiguration>();
                    cfgApp.RoleGuest             = model.AppCoreConfiguration.RoleGuest;
                    cfgApp.RoleUser              = model.AppCoreConfiguration.RoleUser;
                    cfgApp.ApplicationTimezoneId = model.AppCoreConfiguration.ApplicationTimezoneId;

                    var applyResult = AppCore.GetModulesManager().GetModule <CoreModule>().GetConfigurationManipulator().ApplyConfiguration(cfgApp);
                    switch (applyResult.Item1)
                    {
                    case ApplyConfigurationResult.PermissionDenied:
                        result.Message = "Недостаточно прав для сохранения конфигурации системы.";
                        result.Success = false;
                        break;

                    case ApplyConfigurationResult.Failed:
                        var journalData = AppCore.Get <JournalingManager>().GetJournalData(applyResult.Item2.Value);
                        result.Message = $"Возникла ошибка при сохранении настроек: {(journalData.Message ?? "текст ошибки не найден")}.";
                        result.Success = false;
                        break;

                    case ApplyConfigurationResult.Success:
                        System.Web.Routing.RouteTable.Routes.Where(x => x is RouteWithDefaults).Select(x => x as RouteWithDefaults).ForEach(x => x.UpdateDefaults());

                        result.Message = "Сохранено успешно!";
                        result.Success = true;
                        break;
                    }

                    if (result.Success)
                    {
                        var cfg = AppCore.GetModulesManager().GetModule <WebCoreModule>().GetConfigurationManipulator().GetEditable <WebCoreConfiguration>();
                        cfg.IdModuleDefault       = model.WebCoreConfiguration.IdModuleDefault;
                        cfg.DeveloperEmail        = model.WebCoreConfiguration.DeveloperEmail;
                        cfg.SiteFullName          = model.WebCoreConfiguration.SiteFullName;
                        cfg.CriticalMessagesEmail = model.WebCoreConfiguration.CriticalMessagesEmail;
                        cfg.register_mode         = model.WebCoreConfiguration.register_mode;
                        cfg.site_reginfo          = model.WebCoreConfiguration.site_reginfo;
                        cfg.site_loginfo          = model.WebCoreConfiguration.site_loginfo;
                        cfg.help_info             = model.WebCoreConfiguration.help_info;
                        cfg.site_descr            = model.WebCoreConfiguration.site_descr;
                        cfg.site_keys             = model.WebCoreConfiguration.site_keys;

                        cfg.userAuthorizeAllowed = model.WebCoreConfiguration.userAuthorizeAllowed;

                        applyResult = AppCore.GetModulesManager().GetModule <WebCoreModule>().GetConfigurationManipulator().ApplyConfiguration(cfg);
                        switch (applyResult.Item1)
                        {
                        case ApplyConfigurationResult.PermissionDenied:
                            result.Message = "Недостаточно прав для сохранения конфигурации системы.";
                            result.Success = false;
                            break;

                        case ApplyConfigurationResult.Failed:
                            var journalData = AppCore.Get <JournalingManager>().GetJournalData(applyResult.Item2.Value);
                            result.Message = $"Возникла ошибка при сохранении настроек: {(journalData.Message ?? "текст ошибки не найден")}.";
                            result.Success = false;
                            break;

                        case ApplyConfigurationResult.Success:
                            System.Web.Routing.RouteTable.Routes.Where(x => x is RouteWithDefaults).Select(x => x as RouteWithDefaults).ForEach(x => x.UpdateDefaults());

                            result.Message = "Сохранено успешно!";
                            result.Success = true;
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Message = ex.Message;
            }

            try
            {
                if (!result.Success)
                {
                    if (cfgAppOld != null)
                    {
                        AppCore.GetModulesManager().GetModule <CoreModule>().GetConfigurationManipulator().ApplyConfiguration(cfgAppOld);
                    }
                    if (cfgWebOld != null)
                    {
                        AppCore.GetModulesManager().GetModule <WebCoreModule>().GetConfigurationManipulator().ApplyConfiguration(cfgWebOld);
                    }
                }
            }
            catch { }

            return(this.ReturnJson(result));
        }
Beispiel #27
0
        public JsonResult ContainerItemSave(int?idModule = null, int idSchemeItem = 0, int idSchemeItemType = 0, Dictionary <string, int[]> model = null)
        {
            var result = JsonAnswer();

            try
            {
                if (!idModule.HasValue)
                {
                    throw new Exception("Не указан идентификатор модуля.");
                }

                var module = AppCore.GetModulesManager().GetModule(idModule.Value) as IModuleCore;
                if (module == null)
                {
                    throw new Exception("Модуль не найден.");
                }

                var schemeItem = new SchemeItem(idSchemeItem, idSchemeItemType);

                using (var db = Module.CreateUnitOfWork())
                    using (var scope = db.CreateScope())
                    {
                        db.CustomFieldsSchemeDatas.Where(x => x.IdModule == idModule.Value && x.IdSchemeItem == schemeItem.IdItem && x.IdItemType == schemeItem.IdItemType).Delete();

                        int k             = 0;
                        var modelPrepared = model != null?model.Where(x => int.TryParse(x.Key, out k)).ToDictionary(x => uint.Parse(x.Key), x => new List <int>(x.Value)) : null;

                        if (modelPrepared != null)
                        {
                            if (!modelPrepared.ContainsKey(0))
                            {
                                modelPrepared[0] = new List <int>();
                            }
                            foreach (var key in modelPrepared.Keys.ToList())
                            {
                                if (key == 0)
                                {
                                    continue;
                                }
                                var list = modelPrepared[key].Where(x => modelPrepared[0].Contains(x)).ToList();
                                modelPrepared[key] = list;
                            }

                            foreach (var pair in modelPrepared)
                            {
                                int i = 0;
                                foreach (var field in pair.Value)
                                {
                                    db.CustomFieldsSchemeDatas.Add(new CustomFieldsSchemeData()
                                    {
                                        IdModule     = idModule.Value,
                                        IdScheme     = (int)pair.Key,
                                        IdField      = field,
                                        IdSchemeItem = schemeItem.IdItem,
                                        IdItemType   = schemeItem.IdItemType,
                                        Order        = i++
                                    });
                                }
                            }

                            db.SaveChanges();
                        }

                        scope.Commit();

                        result.Message = "Сохранение расположения полей прошло успешно.";
                        result.Success = true;
                    }
                AppCore.Get <ModuleItemsCustomize <WebApplication> >().UpdateCache();
            }
            catch (Exception ex) { result.Message = ex.Message; }

            return(ReturnJson(result));
        }
Beispiel #28
0
        public ActionResult ContainerItem(int?idModule = null, int idSchemeItem = 0, int idSchemeItemType = 0)
        {
            if (!idModule.HasValue)
            {
                throw new Exception("Не указан идентификатор модуля.");
            }

            var module = AppCore.GetModulesManager().GetModule(idModule.Value) as IModuleCore;

            if (module == null)
            {
                throw new Exception("Модуль не найден.");
            }

            var schemeItem = new SchemeItem(idSchemeItem, idSchemeItemType);

            using (var db = this.CreateUnitOfWork())
            {
                var fields = db.CustomFieldsFields.Where(x => x.IdModule == idModule.Value && x.Block == 0).ToDictionary(x => x.IdField, x => x);

                var schemes = db.CustomFieldsSchemes.
                              Where(x => x.IdModule == idModule.Value && x.IdScheme > 0).
                              OrderBy(x => x.NameScheme).
                              ToDictionary(x => (uint)x.IdScheme, x => new SchemeContainerItem.Scheme()
                {
                    Name = x.NameScheme, Fields = new Dictionary <int, IField>()
                });

                schemes[0] = new SchemeContainerItem.Scheme()
                {
                    Name = "По-умолчанию", Fields = new Dictionary <int, IField>()
                };

                var sql = (from datas in db.CustomFieldsSchemeDatas
                           where datas.IdModule == idModule.Value && datas.IdItemType == schemeItem.IdItemType && datas.IdSchemeItem == schemeItem.IdItem
                           group new { datas.IdField, datas.Order } by datas.IdScheme into gr
                           select new { IdScheme = gr.Key, Fields = gr.OrderBy(x => x.Order).Select(x => x.IdField).ToList() });

                var fieldsWithSchemes = sql.
                                        ToList().
                                        ToDictionary(x => (uint)x.IdScheme,
                                                     x => x.Fields.GroupBy(IdField => IdField).
                                                     Select(group => fields.GetValueOrDefault(group.Key)).
                                                     Where(field => field != null).
                                                     ToDictionary(field => field.IdField, field => field as IField)
                                                     );

                var model = new SchemeContainerItem()
                {
                    IdModule   = idModule.Value,
                    SchemeItem = schemeItem
                };

                if (fieldsWithSchemes.ContainsKey(0))
                {
                    schemes[0].Fields = fieldsWithSchemes[0];
                }
                foreach (var p in schemes)
                {
                    model.Schemes[p.Key] = p.Value;

                    if (fieldsWithSchemes.ContainsKey(p.Key))
                    {
                        p.Value.Fields = fieldsWithSchemes[p.Key];
                    }
                    int i = 0;
                    p.Value.Fields = p.Value.Fields.Where(x => schemes[0].Fields.ContainsKey(x.Key)).ToDictionary(x => i++, x => x.Value);
                }

                return(View("Item.cshtml", model));
            }
        }
Beispiel #29
0
        public IController CreateController(RequestContext requestContext, string moduleName)
        {
            requestContext.HttpContext.Items["TimeController"] = DateTime.Now;

            var isAjax = false;

            // Проверка на авторизацию. Ловим случаи, когда авторизация не сработала в HttpApplication.
            var context = AppCore.GetUserContextManager().GetCurrentUserContext();

            if (context.IsGuest)
            {
                var sessionBinder = AppCore.Get <SessionBinder>();
                context = sessionBinder.RestoreUserContextFromRequest();
                if (context != null && !context.IsGuest)
                {
                    AppCore.Get <OnWeb.Modules.Auth.ModuleAuth>()?.RegisterEvent(EventType.CriticalError, "Нарушение процесса авторизации", null);
                    AppCore.GetUserContextManager().SetCurrentUserContext(context);
                }
            }

            IModuleCore module = null;

            try
            {
                /*
                 * Определение языка и темы
                 */
                {
                    var lang = string.Format("{0}", requestContext.RouteData.Values["language"]);

                    using (var db = this.CreateUnitOfWork())
                    {
                        var query = from Language in db.Language
                                    where Language.IsDefault != 0 || Language.ShortAlias == lang
                                    orderby(Language.ShortAlias == lang? 1 : 0) descending
                                    select Language;

                        var data = query.ToList();
                        //var sql = DB.DataContext.ExecuteQuery<DB.Language>(@"
                        //    SELECT TOP(1) *
                        //    FROM Language
                        //    WHERE IsDefault <> 0 OR ShortAlias = '" + DataManager.prepare(lang) + @"'
                        //    ORDER BY CASE WHEN ShortAlias = '" + DataManager.prepare(lang) + @"' THEN 1 ELSE 0 END DESC
                        //");
                        if (data.Count > 0)
                        {
                            var res = data.First();
                            requestContext.RouteData.Values["language"] = res.ShortAlias;
                        }
                    }
                }

                /*
                 * Ищем модуль, к которому обращаются запросом.
                 * */
                if (int.TryParse(moduleName, out int moduleId) && moduleId.ToString() == moduleName)
                {
                    module = (IModuleCore)AppCore.GetModulesManager().GetModule(moduleId);
                }
                else if (Guid.TryParse(moduleName, out Guid uniqueName) && uniqueName.ToString() == moduleName)
                {
                    module = (IModuleCore)AppCore.GetModulesManager().GetModule(uniqueName);
                }
                else
                {
                    module = (IModuleCore)AppCore.GetModulesManager().GetModule(moduleName);
                }

                if (module == null)
                {
                    throw new ErrorCodeException(HttpStatusCode.NotFound, $"Адрес '{moduleName}' не найден.");
                }

                /*
                 * Ищем контроллер, который относится к модулю.
                 * */
                var controllerType = ControllerTypeFactory.RoutingPrepareURL(requestContext.HttpContext.Request, UriExtensions.MakeRelativeFromUrl(requestContext.HttpContext.Request.Url.PathAndQuery));

                if (requestContext.RouteData.Route is Route)
                {
                    /*
                     * Анализируем адрес и устанавливаем признак, если это вызов в панель управления. Пришлось пойти на такой хак.
                     * */
                    var route = requestContext.RouteData.Route as Route;
                    if (route.Url.StartsWith("admin/madmin"))
                    {
                        isAjax = true;
                    }

                    if (isAjax)
                    {
                        HttpContext.Current.Items["isAjax"] = true;
                    }
                }

                var controller = CreateController(controllerType, module, requestContext.RouteData.Values);
                HttpContext.Current.Items["RequestContextController"] = controller;
                return(controller);
            }
            catch (Exception ex)
            {
                try
                {
                    if (module == null)
                    {
                        var moduleTmp = new ModuleInternalErrors();
                        ((IComponentStartable)moduleTmp).Start(AppCore);
                        module = moduleTmp;
                    }

                    var type       = typeof(ModuleControllerInternalErrors <>).MakeGenericType(module.GetType());
                    var controller = CreateController(module, type, requestContext.RouteData.Values);
                    (controller as IModuleControllerInternalErrors).SetException(ex);
                    // todo (controller as Modules.ModuleController).IsAdminController = isErrorAdmin;

                    HttpContext.Current.Items["RequestContextController"] = controller;
                    return(controller);
                }
                catch (Exception ex2)
                {
                    Debug.WriteLine("Throw: {0}", ex2.ToString());
                    throw ex;
                }
            }
        }
Beispiel #30
0
        public JsonResult FieldSave(Model.FieldEdit model = null)
        {
            var result = Controller.JsonAnswer();

            try
            {
                using (var db = this.CreateUnitOfWork())
                {
                    CustomFieldsField data = null;
                    if (model.IdField > 0)
                    {
                        data = db.CustomFieldsFields.Where(x => x.IdField == model.IdField).Include(x => x.data).FirstOrDefault();
                        if (data == null)
                        {
                            throw new Exception("Такое поле не найдено в базе данных!");
                        }
                        if (data.IdModule != this.Module.ID)
                        {
                            var module = AppCore.GetModulesManager().GetModule(data.IdModule);
                            if (module == null)
                            {
                                throw new Exception("Это поле относится к другому модулю.");
                            }
                            else
                            {
                                throw new Exception(string.Format("Это поле относится к модулю '{0}'.", module.Caption));
                            }
                        }
                    }
                    else
                    {
                        data = new DB.CustomFieldsField()
                        {
                            IdFieldType = 0, IdModule = this.Module.ID
                        };
                        db.CustomFieldsFields.Add(data);
                    }

                    if (ModelState.ContainsKeyCorrect(nameof(model.name)))
                    {
                        data.name = model.name;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.nameAlt)))
                    {
                        data.nameAlt = model.nameAlt;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.alias)))
                    {
                        data.alias = model.alias;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.formatCheck)))
                    {
                        data.formatCheck = model.formatCheck;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.IdFieldType)))
                    {
                        data.IdFieldType = model.IdFieldType;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.IsValueRequired)))
                    {
                        data.IsValueRequired = model.IsValueRequired;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.IdValueType)))
                    {
                        data.IdValueType = model.IdValueType;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.size)))
                    {
                        data.size = model.size;
                    }
                    if (ModelState.ContainsKeyCorrect(nameof(model.nameEnding)))
                    {
                        data.nameEnding = model.nameEnding;
                    }

                    using (var scope = db.CreateScope())
                    {
                        var entry = db.GetState(data);
                        if (entry == ItemState.Detached)
                        {
                            throw new Exception("Невозможно найти поле для сохранения.");
                        }
                        else if (entry.In(ItemState.Modified, ItemState.Added))
                        {
                            data.DateChange = DateTime.Now.Timestamp();
                            data.Block      = 0;

                            if (db.SaveChanges <CustomFieldsField>() == 0)
                            {
                                throw new Exception("Сохранение поля провалилось!");
                            }
                        }

                        if (Request.Form.HasKey("values"))
                        {
                            var t    = DateTime.Now.Timestamp();
                            var vals = Request.Form.TryGetValue <CustomFieldsValue[]>("values");

                            if (vals != null)
                            {
                                foreach (var d in vals)
                                {
                                    d.IdField = data.IdField;
                                    //d.Field = data;
                                    d.DateChange = t;
                                }

                                db.CustomFieldsValues.AddOrUpdate(vals);
                            }
                            else
                            {
                                vals = new CustomFieldsValue[0];
                            }

                            var values = vals.ToList();

                            if (values.Count > 0)
                            {
                                if (db.SaveChanges <CustomFieldsValue>() == 0)
                                {
                                    throw new Exception("Не удалось сохранить варианты значений поля");
                                }
                            }

                            data.data = data.FieldType.CreateValuesCollection(data, values);

                            var keys = values.Select(x => x.IdFieldValue);

                            var removeExistsValue   = new Dictionary <int, string>();
                            var removeExistsObjects = new Dictionary <int, List <int> >();

                            var sql = (from p in db.CustomFieldsValues
                                       join d in db.CustomFieldsDatas on p.IdFieldValue equals d.IdFieldValue
                                       where p.IdField == data.IdField && !keys.Contains(p.IdFieldValue)
                                       select new { p, d });

                            foreach (var res in sql)
                            {
                                removeExistsValue[res.p.IdFieldValue] = res.p.FieldValue;
                                if (!removeExistsObjects.ContainsKey(res.p.IdFieldValue))
                                {
                                    removeExistsObjects[res.p.IdFieldValue] = new List <int>();
                                }
                                if (!removeExistsObjects[res.p.IdFieldValue].Contains(res.d.IdItem))
                                {
                                    removeExistsObjects[res.p.IdFieldValue].Add(res.d.IdItem);
                                }
                            }

                            if (removeExistsValue.Count > 0)
                            {
                                var removeTexts = new Dictionary <int, string>();
                                foreach (var pair in removeExistsValue)
                                {
                                    removeTexts[pair.Key] = " - №" + pair.Key + " \"" + pair.Value + "\" у объектов №" + string.Join(", №", removeExistsObjects[pair.Key]);
                                }

                                throw new Exception("Некоторые значения, которые вы пытаетесь удалить, указаны у следующих объектов:\r\n" + string.Join(", \r\n", removeTexts.Values));
                            }

                            //todo подозрение, что неправильный запрос, может очистить всю таблицу.
                            //DB.CustomFieldsValues.Where(x => !keys.Contains(x.IdFieldValue)).Delete();
                        }

                        result.Message = "Сохранение поля прошло успешно!";
                        result.Success = true;
                        result.Data    = data;

                        scope.Commit();
                    }

                    result.Success = true;
                }
            }
            catch (OnUtils.Data.Validation.EntityValidationException ex) { result.Message = ex.CreateComplexMessage(); }
            catch (Exception ex) { result.Message = ex.Message; }

            return(Controller.ReturnJson(result));
        }