【问题标题】:XmlForm.Submit() "hides" the validation result message?XmlForm.Submit() “隐藏”验证结果消息?
【发布时间】:2013-10-10 16:05:14
【问题描述】:

我在 SharePoint 网站中托管的自定义 aspx 页面上使用 XmlFormView 控件。 最近我们的 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
Message=Formularen kan ikke afsendes, fordi den indeholder valideringsfejl。 Fejlene er angivet med en rød stjerne (obligatoriske feeler) eller omgivet af en rød, stiplet streg (ugyldige værdier)。

Felt eller gruppe:MunicipalRealPropertyIdentifier
Fejl: Der må kun angives et bestemt mønster

源=Microsoft.Office.InfoPath.Server
BypassWatson=true
日志 ID=5567
SaveUserSession=false
UserMessage=Formularen kan ikke afsendes, fordi den indeholder valideringsfejl。 Fejlene er angivet med en rød stjerne (obligatoriske feeler) eller omgivet af en rød, stiplet streg (ugyldige værdier)。

Felt eller gruppe:MunicipalRealPropertyIdentifier
Fejl: Der må kun angives et bestemt mønster

OverrideTopLevelMessage=true
堆栈跟踪:

Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard(文档文档、DataAdapter 适配器、XPathNavigator subtreeToCheck、Boolean schemaErrorOnly)
内部异常:

这很好!异常包含有关验证错误的信息。 我继续调试。重新抛出所需的异常,输出内容为:

步入:跳过没有符号“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.Server
绕过Watson=false
SaveUserSession=false
UserMessage=Der opstod en alvorlig fejl under behandlingen af formularen.
堆栈跟踪:
在 Microsoft.Office.InfoPath.Server.Util.GlobalStorage.get_CurrentFormId()
内部异常:

VS 输出现在显示为:

步入:跳过没有符号“Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard”的方法 步入:跳过没有符号“Microsoft.Office.InfoPath.Server.DocumentLifetime.Document.ExecuteDefaultSubmitAction”的方法 步入:跳过没有符号“Microsoft.Office.InfoPath.Server.DocumentLifetime.OMExceptionManager.ExecuteOMCallWithExceptions”的方法

对于 SharePoint,我还是个新手,但我认为这听起来有点像安全问题? 似乎原始异常不是“允许”返回给调用者的。

我尝试在 SharePoint 中启用完整日志记录,但是当我查看“..\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\LOGS”中的日志时,我只能看到“原始" 异常,不是为什么会被覆盖?

附加信息: 该站点当前使用配置设置运行:

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

有人对这个问题有任何想法吗?

在 SharePoint 2007 上,所需的异常被返回给调用者。

【问题讨论】:

    标签: sharepoint sharepoint-2010 xmlformview


    【解决方案1】:

    认为这个问题已经开放了足够长的时间:-)

    问题在于我们使用 XMLFormView 控件的方式。 我没有改变我们的代码逻辑,而是选择了一种解决方法。

    简而言之: 我阅读了此 Microsoft 文档: http://msdn.microsoft.com/en-us/library/microsoft.office.infopath.server.controls.xmlformview.xmlform

    其中一段为:

    只能在以下事件之一期间访问 XmlForm 属性:

    • 初始化
    • NotifyHost
    • 提交给主机
    • 关闭

    我们的代码都不做这些!

    基本上我们从 aspx 页面上的标准按钮进行回发,并从后面的代码尝试调用 XmlFormView1.XmlForm.Submit();

    我发现,在 Microsoft.Office.Infopath 程序集上使用 .NET Reflector,当尝试提交 HttpContext.Current.Items["__GlobalStorage.FormIds"] 时,预计至少包含一个 Id 构成当前表单,但此时尚未设置!

    所以我做了以下小“肮脏的破解”来使代码再次工作:

            /// <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();

    不是一个很好的解决方案,但它可以在不改变任何其他逻辑的情况下工作。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多