Отправка GET запроса на и получение ответа
Технические вопросы
5.x

Всем привет, кто нибудь сталкивался с задачкой, где необходимо отправлять GET/POST запросы на сторонние сервера и получать ответы на эти запросы и далее с ними работать? Если да, то поделитесь своим опытом пожалуйста.

Нравится

1 комментарий

Добрый день!

Можно посылать веб серверу POST(GET, etc) запросы: для этого нужно использовать объект ActiveXObject. Пример получения курса валют от веб сервера, с помощью GET запроса:

var webAddress = "http://cbr.ru/scripts/XML_daily.asp";
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
xmlHttpReq.open("GET", webAddress, false); //or “POST”            
xmlHttpReq.send();
var WebServAnswer = xmlHttpReq.responseText;
Показать все комментарии
карточка редактирования
Технические вопросы
Разработка

Добрый день!

Есть деталь к разделу. В этой детали есть поле, связанное с этой деталью. В детали можно нажать кнопку изменить и откроется карточка редактирования. Можно нажать на подчеркнутое поле, ссылающееся на эту же таблицу, и откроется та же карточка редактирования, но для другой записи. Вопрос: как в скрипте этой карточки определить что карточка редактирования открыта для записи из реестра или для ссылки? Необходимо для того, чтобы некоторые поля в карточке разрешить/запретить для редактирования.

Нравится

4 комментария

При открытии по кнопке или двойному клику по строке вызывается функция EditGridAreaData в scr_BaseGridAreaUtils. Если по ссылке, то DoLookupColumnClick в scr_WindowUtils, а из неё функция ShowDatasetEditWindow.

Далее в обоих случаях вызывается непосредственно функция показа карточки ShowEditWindowEx с одним из параметров Attributes, где хранятся атрибуты окна. Можно модифицировать вышеупомянутые функции, чтобы в атрибуты добавлялся свой, разный для открытия из реестра или по ссылке. А в карточке при открытии проверять его значение.

При изменении функций стоит учесть, что они используются во всех разделах, и не поломать существующую логику.

Александр, не хотелось бы править системные функции, потому что не зная тонкостей поломать логику очень легко. Поэтому и спросил, может есть готовые атрибуты окна при разных вызовах. А возможно ли в карточке при открытии сравнить ID активной записи реестра детали и ID переданного через атрибут в окно? Возможно ли установить между ними связь?

Александр, спасибо за подсказку. Немного проанализировав код я нашел у окна, вызываемого по ссылке, атрибут LookupColumnClick, который я и буду использовать.

Действительно, спасибо за уточнение, не заметил присвоение атрибута. Но ход мысли авторов угадал...

Показать все комментарии
Технические вопросы
5.x

Сделал деталь к разделу Продукция, зарегистрировал.
В объекте детали две колонки, справочники на объект этого же раздела. Одна из них связь с объектом раздела, вторая аналог продукции.
При добавлении новой записи на деталь все в порядке, выбираются значения из справочника.
После сохранения записи детали сразу же в реестре записей детали в этих колонках Нет доступа> пишет и если открыть карточку записи детали в соответствующих полях то же самое.

Не понимаю.
Все права есть, галка "Всегда загружать данные", чистка профилей, кэшей и редиски не повлияло никак.....

Нравится

19 комментариев

Александр. Похожая проблема. Поддержка молчит.
http://www.community.terrasoft.ru/forum/topic/9727

Складывается ощущение, что проблема в как раз в том, что колонки-справочники ссылаются на сам объект раздела.........
Костылей не хочется делать......
Только если в вашем случае я еще как то могу понять, то у меня вообще колонки в другом объекте, пусть это и объект детали раздела.
Надо ТП раскочегарить!

"Шамуилов Александр" написал:Складывается ощущение, что проблема в как раз в том, что колонки-справочники ссылаются на сам объект раздела.........

+1 :smile:

"Александр Кудряшов" написал:
Шамуилов Александр пишет:

Складывается ощущение, что проблема в как раз в том, что колонки-справочники ссылаются на сам объект раздела.........

+1 :smile:


Приятно, но толку то? :wink:

Молчат. Как рыбы. :smile:
Придется писать "костыль".

"Шамуилов Александр" написал:Молчат. Как рыбы. :smile:
Придется писать "костыль".

Да рад бы подсказать, но не могу воспроизвести... но видел я такое точно.
Вместо костыля могу предложить попробовать удалить и пересоздать эти поля в объекте, а затем и на странице. Кстати то что "нет данных" на уровне карточки редактирования и реестра - говорит о проблеме объекта...

Не "нет данных", а <Нет доступа>!!!!!

Объект только что создан

"Шамуилов Александр" написал:

Не "нет данных", а <Нет доступа>!!!!!

Объект только что создан


Опечатался :) то что он создан не значит что все в нем корректно создалось, потому и предлагаю эксперимент по пересозданию
Как вариант отлаживать традиционным Page.BaseMessagePanel.AddMessage - смотреть что там за Id в этом поле подтягивается и так далее

Ребят, вы меня за последние недели с пересозданием, мягко говоря, достали. Я и так времени уже потерял на подобном. С учетом торможения BPM в процессе разработки это невеликое удовольствие.

Объект создался нормально, все галки типа "Отображаемое значение" и загрузка данных в реестре все выставлено правильно. Три раза проверял.

Записи в БД корректные.

Проблема конкретно в том, что при существовании в объекте детали раздела колонки-справочника для которой источником стоит объект этого же раздела, отображение данных не работает.

Я хочу знать: это баг или фича?
Баг -- исправляйте.
Фича -- объясните за каким лешим так и всё равно исправляйте, потому что так не должно быть.

И не морочьте мне голову.

"Шамуилов Александр" написал:Я хочу знать: это баг или фича?
Баг -- исправляйте.
Фича -- объясните за каким лешим так и всё равно исправляйте, потому что так не должно быть.

И не морочьте мне голову.


А я не разработчик и не его представитель:) я так же сижу и конфигурацию готовую правлю.
Имхо - локальный баг, так как специально создал пару полей в детали со ссылкой на основной раздел и все в них хорошо... так что могу только предполагать и рассуждать
Кстати - в основном разделе поле для отображения текстовое? Назначено?

Сорри, думал Вы из Террасофта :smile:.

Да есть текстовое поле, стоит для отображения.

Александр, похожее обращение передано в депаратамент разработки. Как только получим информацию, сразу отпишусь.

Что то создается у меня ощущение, что "департамент разработки" и /dev/null в террасофте синонимы :smile:

Гыуки негодуют, работать хотят, начальство в ярости, а /dev/null и ныне там.....

Александр здравствуйте, предлагаю попробовать такое решение. Такое поведение наблюдается когда у объекта, на который ссылается ваша колонка из детали не выбрано "Отображаемое значение". Но в данном случае при создании нового объекта детали, при попытке выбрать данный объект, в странице выбора из справочника при ее открытии отображается сообщение о том, что не выбрано отображаемое значение в данном объекте. Вы писали "нормально, все галки типа "Отображаемое значение" и загрузка данных в реестре все выставлено правильно". Пытаюсь уточнить насчет того, правильно ли вы все сделали, потому что галка "Отображаемое значение" не галка, а выбираемое значение текстовой колонки объекта. Предлагаю еще раз проверить наличие "Отображаемого значения" и если оно все же выбрано, то удалить его и опубликовать объект. После этого проверить поведение системы (При этом так же должно в поле реестра детали отображаться "Нет доступа", но и при выборе из справочника, при создании новой детали должно отображаться сообщение о недоступности отображаемого значения). После этого попробовать заново выбрать "Отображаемое значение" и снова проверить поведение системы. Ждем от Вас ответа, спасибо.

Все самой собой разрешилось. По всей видимости помогли выходные. За двое суток бездействия по всей видимости перезапустился пул приложений и все стало отображаться.

Мда... Мне кажется, за dev/null и за "И не морочьте мне голову" можно было бы и извиниться по прошествии двух суток бездействия.

Правда ваша, прошу прощения, эмоции...

Кстати, вот возник такой вопрос. Работа пользователей идет достаточно интенсивно и параллельно идет процесс разработки в процессе внедрения, так что перезапусков пула частых они не поймут.

Можно ли в рамках существующей лицензии поднять "рядом" еще один сервер bpm для разработки и отладки? И как организовать процесс переноса изменений? Через метаданные?

Для тех, кому интересно, обсуждение продолжено сюда :wink:

"Крюков Н.А." написал:

Александр здравствуйте, предлагаю попробовать такое решение. Такое поведение наблюдается когда у объекта, на который ссылается ваша колонка из детали не выбрано "Отображаемое значение". Но в данном случае при создании нового объекта детали, при попытке выбрать данный объект, в странице выбора из справочника при ее открытии отображается сообщение о том, что не выбрано отображаемое значение в данном объекте. Вы писали "нормально, все галки типа "Отображаемое значение" и загрузка данных в реестре все выставлено правильно". Пытаюсь уточнить насчет того, правильно ли вы все сделали, потому что галка "Отображаемое значение" не галка, а выбираемое значение текстовой колонки объекта. Предлагаю еще раз проверить наличие "Отображаемого значения" и если оно все же выбрано, то удалить его и опубликовать объект. После этого проверить поведение системы (При этом так же должно в поле реестра детали отображаться "Нет доступа", но и при выборе из справочника, при создании новой детали должно отображаться сообщение о недоступности отображаемого значения). После этого попробовать заново выбрать "Отображаемое значение" и снова проверить поведение системы. Ждем от Вас ответа, спасибо.

Лично у меня данные манипуляции не увенчались успехом. Решил проблему следующим образом - удалил из объекта ссылку на "проблемный", после сам этот "проблемный" объект. Пересоздал заново объект, ссылку на него. Пришлось правда пересоздать карточку редактирования - ее очень весело покорежило. Итог - нормальное отображение

Показать все комментарии
реестр
Технические вопросы
5.x

В процессе эксплуатации BPM я понял, что если у меня есть реестр в детали или основной реестр в разделе, то перейти к "связанным" записям (например Договор - поле "Контрагент", "Контакт", и так далее) можно через контекстное меню "Перейти к..." только если в реестре отображается колонка с соответствующим полем.
А если полей-справочников много, все колонки мне видеть совершенно ни к чему, но переход к этим записям все же нужен? Понятно, что можно сделать свое контекстное меню с нужными пунктами:smile:
Но наверняка есть некий простой способ добиться отображения всех "связанных" объектов в штатном меню независимо от настроек реестра?

И сразу же второй вопрос - а от какого параметра/хитрого скрипта зависит то, что из детали раздела можно перейти к соответствующей записи в разделе? Скажем из детали "Продукты" в "Документах" перейти в раздел "Продукты"? Нет ведь такой возможности по-умолчанию.

Нравится

5 комментариев

Здравствуйте, Александр!
Формирования списка меню "Перейти к" формируется в mainPage в обработчике события "PageLoadComplete", а если конкретнее, то начиная с 159 строки:

var entitySchemaQuery = new EntitySchemaQuery(entitySchemaManager, "SysModule");
entitySchemaQuery.Cache = UserConnection.SessionCache.WithLocalCaching(TSConfiguration.CacheUtilities.WorkspaceCacheGroup);
EntitySchemaQueryColumn entitySchemaColumn = entitySchemaQuery.AddColumn("SysModuleEntity.SysEntitySchema");			
EntitySchemaQueryColumn pageSchemaColumn = entitySchemaQuery.AddColumn("SysPageSchema");
entitySchemaQuery.Filters.Add(entitySchemaQuery.CreateIsNotNullFilter("[SysModuleInSysModuleFolder:SysModule].Id"));
entitySchemaQuery.CacheItemName = "window.modules";
EntityCollection modulesCollection = entitySchemaQuery.GetEntityCollection(Page.UserConnection);
var modules = new Dictionary<string, Guid>();
foreach(var module in modulesCollection) {
	var pageSchemaId = entitySchemaQuery.GetTypedColumnValue<Guid>(module, pageSchemaColumn.Name);
	var schemaId = entitySchemaQuery.GetTypedColumnValue<Guid>(module, entitySchemaColumn.Name);
	string key = "'"+schemaId.ToString()+"'";
	if ((pageSchemaId != Guid.Empty) && (schemaId != Guid.Empty) && (!modules.ContainsKey(key))) {
		modules.Add(key, pageSchemaId);
	}
}

Вы можете попробовать изменить эту логику, стандартного решения данного вопроса, к сожалению, нет.

Андрей, посмотрел данный код... результатом его является просто список некоторых реквизитов ВСЕХ модулей системы. Не вижу формирования элемента контекстного меню. Нет назначения элементу меню обработчика.
Формирование меню где-то глубже...

Александр, действительно я ошибся.
После консультации в отделе разработки сказали, что заполнение этого меню происходит в ядре и конфигурационно не получится добавить или удалить из него пункты.

"Андрей Каспаревич" написал:
После консультации в отделе разработки сказали, что заполнение этого меню происходит в ядре и конфигурационно не получится добавить или удалить из него пункты.

Андрей, а можно ли уточнить принципы формирования - они совершенно не понятны. Примеры я привел - деталь Продукты в Документах, нет перехода к продукту (1). В реестре есть переход только к тем объектам, соответствующие которым колонки вынесены в реестр (2). Но, несмотря на (2), в детали продукты поле Продукт (справочник!) в реестр вынесено и перехода по-прежнему нет...
Можно сформулировать это как пожелание - чтобы в реестрах был всегда переход ко всем связанным объектам (как это всегда работало в продуктах линейки 3.х)
Переход из дочерней детали (пример 1) в раздел, допускаю что сделать сложнее, но опять же выскажу это пожелание...

Александр, действительно в данный момент переход формируется только для справочных полей, которые отображены в реестре.
Спасибо за обращение, я направлю Ваши пожелания в отдел разработки.

Показать все комментарии
error
Технические вопросы
5.x

Добрый день, при публикации объекта на рабочем сервере возникает следующая ошибка, а при публикации на сервере разработки всё нормально. Вопрос что означает эта ошибка и как с ней бороться?

Нравится

5 комментариев

Вот тоже такую ошибку видел. Причина - на рабочем сервере у вас данные уже в этой таблице есть, а вы создаете новое поле либо модифицируете существующее, установив обязательность заполнения.
У меня получилось обойти так: опубликовать без признака обязательно к заполнению, а затем опубликовать, установив признак.
А как "выбрать действие для исправления" нам расскажет, надеюсь, поддержка:smile: сам с удовольствием почитаю

Обязательность лучше выставлять "на уровне приложения", во избежание.

"Зверев Александр" написал:Обязательность лучше выставлять "на уровне приложения", во избежание.

Все равно такая ошибка может лезть... был удивлен, когда увидел:smile:

Так признак обязательности и выставлен "на уровне приложения"

Илья, а не пробовали установить каскадную связь?
Если после установления каскадной связи проблема останется, прошу предоставить данные для удаленного доступа.

Показать все комментарии
Технические вопросы
5.x

У меня на сервере есть html файл как его отобразить в системе

Нравится

7 комментариев

Нужно передать ваш html на клиент в виде строки. Например через сервис конфигурационный.
html разметку нужно вставить в Terrasoft.Component.
Созданный компонент добавить во view
Пример создания Terrasoft.Component:

var html = '<img id = "' + name + '-img-control" class = "' + className + '" src="' + imageUrl + '">';
var component = {
	className: 'Terrasoft.Component',
	html: html,
	selectors: {
		wrapEl: '#' + name + '-control'
	}
};

Александр, мне нужно при нажатие на кнопку просмотреть в Реестре вывести на экран не страницу редактирования со значениями а html форму сформированную на сервере

Возможным вариантом решения есть создание своего модуля.
По нажатию на кнопку "Просмотреть" в реестре, можно его загрузить через sandbox вместо модуля карточки.
А уже в модуле можно определить 'Terrasoft.Component', как описано выше.
Html разметку сможете получить ajax запросом из созданного модуля к вашему серверу.

"Фещенко Денис" написал:

Возможным вариантом решения есть создание своего модуля.

По нажатию на кнопку "Просмотреть" в реестре, можно его загрузить через sandbox вместо модуля карточки.

А уже в модуле можно определить 'Terrasoft.Component', как описано выше.

Html разметку сможете получить ajax запросом из созданного модуля к вашему серверу.

Если можно пример кода:sad:

Точного примера для вашего запроса в системе нет.
Могу прислать следующее:
Пример кода по загрузке модуля из модуля раздела:

var sandbox = this.getSandbox();
var newCardModuleId = 'ViewModule_CardModule_' + this.entitySchema.name;
sandbox.loadModule('CardModule', {
			renderTo: this.getContainer(),
			id: newCardModuleId,
			keepAlive: true
		});

Вместо 'CardModule' - подставляете имя своего модуля.
newCardModuleId - генерируете свой идентификатор для модуля.

Примером произвольного модуля для вас может послужить например DashboardSection.
По примеру вместо контейнеров для графиков вы определите один 'Terrasoft.Component' для вашего html.

Денис, большое спасибо все получилось

Антон, рад был помочь!

Показать все комментарии
Технические вопросы
5.x

Написал свой Web-сервис, который выполняет хранимую процедуру в БД.
Вопрос: как зарегистрировать сервис в системе, какие строчки необходимо прописать в конфигурационных файлах

Нравится

8 комментариев

Добавление сервиса:
В системе существует возможность написать свой WCF сервис.
1. Создаем схему "Исходный код".
2. Пример кода который содержит схема:

namespace Terrasoft.Configuration.CommandLineService
{
	using System.CodeDom.Compiler;
	using System.ServiceModel;
	using System.ServiceModel.Web;
	using System.ServiceModel.Activation;
	using System.Web;
	using Terrasoft.Common;
	using Terrasoft.Core;
	using Terrasoft.Core.DB;
	using Terrasoft.Core.Entities;
	using Terrasoft.Core.Store;
	using System;
	using System.Data;
	using System.Collections.Generic;
	using System.Linq;
	using Newtonsoft.Json.Linq;
 
        [ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class TestService
	{
 
		[OperationContract]
		[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
		public string TestServiceMethod(string data)
		{
			var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
			string key = string.Format("ExportFilterKey_{0}", Guid.NewGuid());
			userConnection.SessionData[key] = data;
			return key;
		}
         }
}

сервис содержит один тестовый метод который принимает строку и возвращает строку.
Публикуем схему
3. Вызов сервиса на стороне клиента

var request = Terrasoft.AjaxProvider.request({
				url: "../rest/TestService/TestServiceMethod",
				headers: {
					'Accept': 'application/json',
					'Content-Type': 'application/json'
				},
				method: 'POST',
				jsonData:  'test data',
				callback: function(request, success, response) {
					if (success) {
						console.log(response.responseText);
					}
				},
				scope: this
			});

Примеров в системе очень много.
ReportService, ColumnService

Александр, большое спасибо, с Web-сервисом все получилось

У меня сработал но передать данные не получилось. После добавления

BodyStyle = WebMessageBodyStyle.Wrapped

в

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat =WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

и правильном задании параметра jsonData (в формате jSon):

jsonData:  {
      data: ‘some data’
}

Напишите как у Вас метод принимает параметры?

Это рабочий вариант, и работает как описано выше

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode =
 AspNetCompatibilityRequirementsMode.Required)]
public class ITS_Servises
{
	[OperationContract]
	[WebInvoke(Method = "POST", BodyStyle =WebMessageBodyStyle.Wrapped,
	RequestFormat =WebMessageFormat.Json, ResponseFormat = 
        ebMessageFormat.Json)]
	public string SendDataTest (string name)
	{			
	     return name;
	}
 
}

Попробуйте

jsonData:  {
      data: {'name' :‘some data’}
}

"Бондаренко Александр Сергеевич" написал:

Попробуйте

jsonData:  {

      data: {'name' :‘some data’}

}


я знаю =) я просто к Вашему примеру написал=) потому что он чуток не коректный и заработает после указаных правок. И еще одно без атрибута "BodyStyle =WebMessageBodyStyle.Wrapped" не запрыгнет туда брейкпоинт

Вы изменили метод добавив атрибут, конечно он не будет работать, сервис будет по другому параметры принимать =)
На breakpoin это никак не может влиять.

Показать все комментарии
5.x
Технические вопросы

Добрый день!

Есть проблема, в процессе страницы в событии LoadPageCompleated добавляю свою функцию на JS.
В которой передаю некоторый параметр в другое событие этой же страницы при помощи Terrasoft.AjaxMethods.ThrowClientEventWithParameters.

Прихожу в событие ловлю параметр который передал. И вот самое интересное, что я не могу внутри этого события обратиться к Page, потому что она null.
Кто знает в чем проблема?

Нравится

12 комментариев

Здравствуйте!
Не могли бы Вы подробнее описать проблему. В какое событие Вы передаете, на какой странице?

Конечно могу рассказать и показать:

И так внутри скрипта события код моей процедуры на JavaScript, который передает параметр в событие GetPhoneState в обработчике которого не видно Page. Еще раз повторюсь, что все происходит на одной странице.

Хорошее разрешение на скрине http://hostingkartinok.com/show-image.php?id=aa0e73f38e1ade5d4250400ac6…

Есть такое мнение, что как-то не правильно передаем Page.Process.InstanceUid. Потому, как при вызове нашего события его уже нет.

Все получилось. Спасибо Михаилу Павлову.

Рад, что у Вас получилось, обращайтесь еще.

У меня чем-то похожая проблема.
Есть страница редактирования, стандартно поднимаемая из реестра. На ней кнопка, поднимающая окно диалога, в котором пользователь вводит некий параметр. Его значение надо вернуть по ОК и закрытию поднятого диалогового окна в страницу редактирования и желательно, чтобы отработало событие процесса страницы редактирования.
Ситуация похожая на работу со справочником, вызываемым из стандартного контрола, только вместо контрола кнопка и окно свое, а не справочника поднимается.
На данный момент добился того, чтобы через SessionData получить в "родительском" окне выбранное в диалоге значение... но вот вызываю из диалога по закрытию его эвент родительского процесса - он вызывается, но в нем не виден Page... соответственно не могу в этом эвенте обращаться к контролам на странице редактирования и так далее...

эвент вызываю на кнопке ОК диалога через
parentProcess.ThrowEvent(parentProcess.InternalContext, "EventName")
parentProcess получаю через переданный в диалог параметр... смотрел дебаггером экземпляр процесса вроде тот что нужно, но внутри эвента Page = null...

Здравствуйте, Александр!
Попробуйте использовать стандартное действие процесса "Открыть страницу" и в нем указывать параметр "CloseMessage" и обрабатывать это сообщение в родительской странице, а не бросать сообщение "вручную" из страницы.

Добрый день, Андрей!
Именно этим действием я и поднимаю окно. И с назначения параметра CloseMessage я начинал - оно не ловилось в процессе карточки редактирования при закрытии поднимаемого из нее окна... потому я и ушел во все тяжкие

Александр, а можете более подробно описать эту часть процесса, со скриншотами и скриптами?

Александр, у меня была данная проблема потому, что я не в ту страницу отправлял евент проверьте что parentProcess.InternalContext возвращает именно ID вашей нужной страницы.

Спасибо за участие, сейчас занялся другими вопросами - постараюсь как только появится время прояснить ситуацию, описав проблему подробнее

Александр, действительно, сообщение может отправляться не в ту страницу просто. Посмотрите механизм реализации этого функционала в "OpenLookupUserTask" и попробуйте сделать по аналогии. Должно правильно работать.

Показать все комментарии
Технические вопросы
5.x

Вдогонку к теме (раз уж с URL разделов разобрались)
https://community.terrasoft.ru/forum/topic/9805
возник такой вопрос: как мне направить пользователя на конкретный URL?
Понятно, что надо что то дописать в MainPage.PageLoadComplete, но вопрос что и куда, чтобы всё не упало.......

Нравится

12 комментариев

И в ответ тишина........
Никто не пробовал что ли?
И мыслей нет?
Мне интересно через
HtmlWindow.Open из System.Windows.Forms стоит пробовать или сразу забыть?

И еще такой вопрос: так как надо перенаправлять пользователя не всегда, а только после того как он вошел в систему (после "чистого" логина) как мне узнать с какого URL пришел пользователь?
Через HttpContext доставать?

Здравствуйте. По поводу вопроса в шапке:
http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx

А по поводу второго вопроса, мне кажется проще дописать в сессию пользователя какой-то флаг, и от него уже "плясать".
Что-то вроде:

public void Redirect()
    {
       HttpSessionState session = HttpContext.Current.Session;
        if (session["redirect"] == null) {
            session.Add("redirect", 1);
            HttpContext.Current.Response.Redirect(url);             
    }

"Олейник Дмитрий" написал:

Здравствуйте. По поводу вопроса в шапке:

http://msdn.microsoft.com/en-us/library/t9dwyts4.aspx

С уважением,

Олейник Дмитрий

Эксперт 3-й линии поддержки


Ларчик просто открывался :-)

"Олейник Дмитрий" написал:
проще дописать в сессию пользователя какой-то флаг

с этого момента поподробнее, не понял

а, пардон, понял. Но все равно не понял :-)
Этот Redirect в MainPage получается вставлять?.....

Александр, да.

Спасибо, попробую.

Все получилось. :smile:

Метод перенаправляет на URL раздела, указанный в справочнике DepartmentHomeModule, департамент берет из записи контакта. Ежели уже перенаправляли, то ничего не делает (пользователь уже вошел), ну и если URL не установлен в справочнике тоже ничего не делает.

Метод такой вышел:

void RedirectToDepartmentHomeModule(Guid ContactId) {
 
Guid DepartmentId = Guid.Empty;
string HomeURL = "";
 
var session = HttpContext.Current.Session;
 
if (session["redirect"] == null) {
	session.Add("redirect", 1);
 
	Select selectDepartmentId = new Select(UserConnection).
			Column("DepartmentId").
				From("Contact").
					Where(Column.Const(ContactId.ToString())).IsEqual("Id")
		as Select;			
 
	using (var dbExecutor = UserConnection.EnsureDBConnection()) {
		using (IDataReader dr = selectDepartmentId.ExecuteReader(dbExecutor)) {
			if (dr.Read()) {
				DepartmentId = UserConnection.DBTypeConverter.DBValueToGuid(dr[0]);
			}			
		}
	}
 
	Select selectHomeURL = new Select(UserConnection).
			Column("HomeURL").
				From("DepartmentHomeModule").
					Where(Column.Const(DepartmentId.ToString())).IsEqual("DepartmentId")
		as Select;			
 
	using (var dbExecutor = UserConnection.EnsureDBConnection()) {
		using (IDataReader dr = selectHomeURL.ExecuteReader(dbExecutor)) {
			if (dr.Read()) {
				HomeURL = dr[0].ToString();
			}			
		}
	}
 
	if (!String.IsNullOrWhiteSpace(HomeURL)) {
		HttpContext.Current.Response.Redirect( HomeURL );
	}
}
}

P.S. Одного не пойму: какого лешего столь простую (как оказывается) функциональность нельзя было реализовать сразу в поставке? Задача стандартная до ужаса..... ну да ладно......

Ну, как вариант, часть кода с запросом можно унифицировать: создать свой класс в SourceScheme и реализовать общий метод. Что-то вроде

public string executeSelect(string columnName, string tableName, string recordId, string filterColumnName)
{
var result;
Select selectDepartmentId = new Select(UserConnection).
                        Column(columnName).
                                From(tableName).
                                        Where(Column.Const(recordId)).IsEqual(filterColumnName)
                as Select;                      
 
        using (var dbExecutor = UserConnection.EnsureDBConnection()) {
                using (IDataReader dr = selectDepartmentId.ExecuteReader(dbExecutor)) {
                        if (dr.Read()) {
                                result= UserConnection.DBTypeConverter.DBValueToGuid(dr[0]);
                        }                       
                }
        }
        return result.ToString();
}

и тогда все будет красивее:

void RedirectToDepartmentHomeModule(Guid ContactId) {
 
Guid DepartmentId = Guid.Empty;
string HomeURL = "";
 
var session = HttpContext.Current.Session;
 
if (session["redirect"] == null) {
        session.Add("redirect", 1);
        string res = executeSelect("DepartmentId", "Contact", ContactId.ToString(), "Id");
        string res2 = executeSelect("HomeURL", "DepartmentHomeModule", res , "DepartmentId");
 
 
        if (!String.IsNullOrWhiteSpace(res2)) {
                HttpContext.Current.Response.Redirect( res2);
        }
}
}

Согласен. Вообще эту конструкция много где пользуется, надо так и сделать.

Показать все комментарии
Технические вопросы
5.x

Как сформировать URL на раздел?
Если делать так:
http://bpm/0/ViewPage.aspx?Id={ID СТРАНИЦЫ РАЗДЕЛА}
то открывается страница раздела, но "голая", без всей "обвязки" в виде закладок рабочих мест, разделов и т.д.

Хочется чтобы открывался нужный раздел, но культурно со всеми причиндалами сопутствующими.....

Нравится

4 комментария

Изучал, как сделать открытие раздела с выбранной в нём записью. Может, будет полезно:

http://localhost/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&pcv=[guid записи]&pdv=[name записи]&ActiveTabId=PageContainer_[guid раб. места]_[guid раздела]_[guid в SysModuleInSysModuleFolder]

Пример:

http://localhost/0/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&pcv=0b2de5af-f887-41b6-9ffc-d96da088a07e&pdv=VPupkin&ActiveTabId=PageContainer_5ca0dabc8c894e1a9bb536407e1c4ef2_065063c98180e011afbc00155d04320c_800581929880e011afbc00155d04320c

pdv=[name записи]

вот это не совсем понял что имеется ввиду

Значение первичного поля для отображения, обычно Name.

Спасибо, разобрался.

Вот так работает просто до конкретного раздела:
http://bpm/0/ViewPage.aspx
?
Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a
&
ActiveTabId=PageContainer
_[ID Рабочего места в SysModuleFolder]
_[ID Раздела в SysModule]
_[ID Записи Раздела в SysModuleInSysModuleFolder]

Ну и не забывать про мелочи, что ID'шники после PageContainer без дефисов и скобок.... :smile:

Показать все комментарии