Sharepoint XmlForm.Submit();生皮;验证结果消息?

Sharepoint XmlForm.Submit();生皮;验证结果消息?,sharepoint,sharepoint-2010,xmlformview,Sharepoint,Sharepoint 2010,Xmlformview,我正在SharePoint站点中托管的自定义aspx页面上使用XmlFormView控件。 最近,我们的SharePoint升级到2010年,之后我遇到了由XmlForm.Submit()触发的表单验证问题 如果提交表单的验证失败,自定义页面实际上依赖SharePoint引发的异常。验证消息已格式化,并以友好的方式向用户显示 提交包含无效用户提供数据的表单时,将返回“Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException”。 此异

我正在SharePoint站点中托管的自定义aspx页面上使用XmlFormView控件。 最近,我们的SharePoint升级到2010年,之后我遇到了由XmlForm.Submit()触发的表单验证问题

如果提交表单的验证失败,自定义页面实际上依赖SharePoint引发的异常。验证消息已格式化,并以友好的方式向用户显示

提交包含无效用户提供数据的表单时,将返回“Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException”。 此异常不包含有关witch字段包含无效数据的信息。 实际上,我期待的是“Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException”。 (提交成功,如果表单不包含验证错误,则不会引发异常)

如果我取消选中Visual Studio中的“仅启用我的代码(仅限托管)”选项并调试表单提交,则会出现以下异常(包含丹麦文本):

Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException发生异常
Message=公式,适用于独立持有人有效的ejl。她是一个有责任的人,她是一个有责任感的人,她是一个有责任感的人 Felt-eller-gruppe:市政房地产鉴定人
2月1日:安杰夫斯和贝斯特姆·莫斯特的作品

Source=Microsoft.Office.InfoPath.Server
BypassWatson=true
LogId=5567
SaveUserSession=false
UserMessage=公式,用于确定独立持有人的有效性。她是一个有责任的人,她是一个有责任感的人,她是一个有责任感的人 Felt-eller-gruppe:市政房地产鉴定人
2月1日:安杰夫斯和贝斯特姆·莫斯特的作品

OverrideTopLevelMessage=true
StackTrace:
位于Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard(文档文档、DataAdapter适配器、XPathNavigator子目录检查、布尔模式错误)
内部异常: 这很好!异常包含有关验证错误的信息。 我继续调试。将重新引发所需的异常,输出内容如下:

单步执行:单步执行不带符号“Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard”的方法 单步执行:单步执行不带符号的方法“Microsoft.Office.InfoPath.Server.DocumentLifetime.Document.ExecuteDefaultSubmitAction” 这还不错!我继续调试,但现在原始异常丢失,并且返回InfoPathFatalException

出现Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException异常
Message=引发了类型为“Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException”的异常。
Source=Microsoft.Office.InfoPath.Server
参数=false
SaveUserSession=false
UserMessage=behandlingen af formularen下的alvorlig fejl选项。
StackTrace:
在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.OmeExceptionManager.ExecuteOMCallWithExceptions”的方法 谈到SharePoint,我是个新手,但我觉得这有点像安全问题? 似乎不允许原始异常“冒泡”回调用方

我已尝试在SharePoint中启用完全登录,但当我查看“.\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\logs”中的日志时,我只能看到“原始”异常,而看不到它被覆盖的原因

其他信息: 站点当前使用以下配置设置运行:

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

有人对这个问题有什么想法吗


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

认为这个问题已经讨论得够久了:-)

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

简言之: 我阅读了以下Microsoft文档:

其中一节内容如下:

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

  • 初始化
  • 通知主机
  • 提交主机
  • 接近
我们的代码没有这两个功能

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

我使用Microsoft.Office.Infopath程序集上的.NET Reflector发现,在尝试提交HttpContext.Current.Items[“\uu 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;
                }
            }
        }
    }
//
///更新到InfoPath 2010后修复此问题的恶意攻击
/// 
私有静态无效InfoPath2010Hack()
{
if(HttpContext.Current!=null)
{
if(HttpContext.Current.Items[“\uu GlobalStorage.FormIds”]==null)
{
var formIds=新堆栈();
formIds.Push(“XmlFormView1”);
HttpContext.Current.Items[“\uu GlobalStorage.FormIds”]=FormIds;
}
其他的
{
var formIds=((堆栈)HttpContext.Current.Items[“\uuu Glob