XmlForm.Submit () «скрывает» сообщение с результатом проверки? - PullRequest
0 голосов
/ 11 июля 2011

Я использую элемент управления XmlFormView на настраиваемой странице aspx, размещенной на сайте SharePoint.Недавно наша SharePoint была обновлена ​​до 2010 года, и после этого у меня возникли проблемы с проверкой формы, вызванной XmlForm.Submit ().

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

Когда отправляется форма, содержащая недопустимые данные, предоставленные пользователем, возвращается «Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException».,Это исключение не содержит информацию о полях ведьмы содержит недопустимые данные.На самом деле я ожидал "Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException".(Подтверждение выполнено успешно и исключение не выдается, если форма не содержит ошибок проверки)

Если я сниму флажок «Включить только мой код (только управляемый)» в Visual Studio и отладлю отправку формы, я получуследующее исключение (содержит датские тексты):

Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterExceptionСообщение = Formularen kan ikke afsendes, ford den Indeholder valideringsfejl.Fejlene er angivet med en rød stjerne (обязательный сборщик) eller omgivet af en rød, стиплет стрег (ugyldige værdier).Войлок Эллер груп: MunicipalRealPropertyIdentifierFejl: Der må kun angives et bestemt mønsterИсточник = Microsoft.Office.InfoPath.ServerBypassWatson = верноLOGID = 5567SaveUserSession = ложьUserMessage = Formularen kan ikke afsendes, for for den Indeholder valideringsfejl.Fejlene er angivet med en rød stjerne (обязательный сборщик) eller omgivet af en rød, стиплет стрег (ugyldige værdier).Войлок Эллер груп: MunicipalRealPropertyIdentifierFejl: Der må kun angives et bestemt mønsterOverrideTopLevelMessage = верноТрассировки стека:вMicrosoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard (документ документа, адаптер адаптера данных, XPathNavigator subtreeToCheck, логическая схемаErrorOnly)InnerException:

Это хорошо!Исключение содержит информацию об ошибках проверки.Продолжаю отладку.Требуемое исключение перебрасывается, и вывод показывает:

Шаг в: переход по методу без символов 'Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard' Шаг в: переход по методу без символов 'Microsoft.Office.InfoPath.Server.DocumentLifetime.Document.ExecuteDefaultSubmitAction '

Это все еще хорошо!Я продолжаю отладку, но теперь исходное исключение потеряно и возвращено исключение InfoPathFatalException.

Microsoft.Office.InfoPath.Server.Util.InfoPathFatalExceptionСообщение = исключение типа 'Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException' было сгенерировано.Источник = Microsoft.Office.InfoPath.ServerBypassWatson = ложьSaveUserSession = ложьUserMessage = Der opstod en alvorlig fejl в соответствии с формулами.Трассировки стека:в Microsoft.Office.InfoPath.Server.Util.GlobalStorage.get_CurrentFormId ()InnerException:

Теперь вывод VS выглядит следующим образом:

Шаг в: переход по методу без символов.символы 'Microsoft.Office.InfoPath.Server.DocumentLifetime.Document.ExecuteDefaultSubmitAction' Шаг в: переход на метод без символов 'Microsoft.Office.InfoPath.Server.DocumentLifetime.OMExceptionManager.ExecuteOMCallWithExceptions'

новичок, когда дело доходит до SharePoint, но я думаю, что это немного похоже на проблему безопасности?Кажется тисходное исключение не «разрешено» отправлять сообщения вызывающему абоненту.

Я пытался включить полную регистрацию в SharePoint, но когда я смотрю журналы в ".. \ Program Files \ Common Files \ Microsoft Shared \ Расширения веб-сервера \ 14 \ LOGS", я вижу только "оригинал исключение, а не почему оно перезаписано?

Дополнительная информация: В настоящее время сайт работает с настройкой конфигурации:

<trust level="Full" originUrl="" />

У кого-нибудь есть идеи по этому вопросу?

В SharePoint 2007 желаемое исключение возвращается обратно вызывающей стороне.

1 Ответ

1 голос
/ 21 июня 2012

Думаю, этот вопрос был открыт достаточно долго: -)

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

Короче говоря: Я прочитал эту документацию Microsoft: http://msdn.microsoft.com/en-us/library/microsoft.office.infopath.server.controls.xmlformview.xmlform

Один из разделов гласил:

Свойство XmlForm доступно только во время одного из следующих событий:

  • Initialize
  • NotifyHost
  • SubmitToHost
  • Закрыть

Наш код не выполняет ни одного из них!

Обычно мы выполняем обратную передачу со стандартной кнопки на странице aspx, а из кода пытаемся вызвать XmlFormView1.XmlForm.Submit ();

Я обнаружил, используя .NET Reflector в сборке Microsoft.Office.Infopath, что при попытке отправить HttpContext.Current.Items ["__ GlobalStorage.FormIds"] * * должен содержать хотя бы один Идентификатор текущей формы, но на данный момент она еще не установлена!

Итак, я сделал следующий маленький «грязный хак», чтобы код снова заработал:

        /// <summary>
    /// Dirty hack to fix issue after update to InfoPath 2010 
    /// </summary>
    private static void InfoPath2010Hack()
    {
        if (HttpContext.Current != null)
        {
            if (HttpContext.Current.Items["__GlobalStorage.FormIds"] == null)
            {
                var formIds = new Stack<string>();
                formIds.Push("XmlFormView1");
                HttpContext.Current.Items["__GlobalStorage.FormIds"] = formIds;
            }
            else
            {
                var formIds = ((Stack<string>)HttpContext.Current.Items["__GlobalStorage.FormIds"]);
                if (formIds.Count <= 0)
                {
                    formIds.Push("XmlFormView1");
                    HttpContext.Current.Items["__GlobalStorage.FormIds"] = formIds;
                }
            }
        }
    }

В любом месте кода, прежде чем я попытаюсь получить доступ к XmlFormView1.XmlForm, я просто вызываю InfoPath2010Hack ();

Не очень хорошее решение, но оно работает без изменения какой-либо другой логики.

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