2011-07-11 97 views
0

我在SharePoint站點中託管的自定義aspx頁上使用XmlFormView控件。 最近我們的SharePoint升級到2010年,之後我遇到了由XmlForm.Submit()觸發的表單驗證問題。XmlForm.Submit()「隱藏」驗證結果消息?

如果驗證提交的表單失敗,則自定義頁實際上依賴於SharePoint引發的異常。驗證消息被格式化並以友好的方式顯示給用戶。

當提交包含無效用戶提供數據的表單時,將返回「Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException」。 此異常不包含有關巫婆字段包含無效數據的信息。 其實我期待一個「Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException」。 (提交成功,如果表單不包含驗證錯誤,則不會拋出異常)

如果我在Visual Studio中取消選中「啓用只是我的代碼(只管理)」選項並調試表單提交,以下異常(包括丹麥文本):發生

Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException
消息= Formularen根IKKE afsendes,fordi書房indeholder valideringsfejl。 Fejlene er angivet med enrødstjerne(obligatoriske felter)eller omgivet afrød,stiplet streg(ugyldigeværdier)。

毛氈埃勒GRUPPE:MunicipalRealPropertyIdentifier
Fejl:明鏡馬昆angives等bestemt怪物

源= Microsoft.Office.InfoPath.Server
BypassWatson =真
LOGID = 5567
SaveUserSession =假
UserMessage =公式,可以使用公式表達式,fordi den indeholder valideringsfejl。 Fejlene er angivet med enrødstjerne(obligatoriske felter)eller omgivet afrød,stiplet streg(ugyldigeværdier)。

毛氈埃勒GRUPPE:MunicipalRealPropertyIdentifier
Fejl:明鏡馬昆angives等bestemt怪物

OverrideTopLevelMessage =真
堆棧跟蹤:

Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard(文檔文檔,DataAdapter適配器,XPathNavigator subtreeToCheck,Boolean schemaErrorOnly)
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.Server
BypassWatson =假
SaveUserSession =假
UserMessage =明鏡opstod EN alvorlig fejl下behandlingen AF formularen。
堆棧跟蹤:
在Microsoft.Office.InfoPath.Server.Util.GlobalStorage.get_CurrentFormId()
的InnerException:

的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上,所需的異常將返回給調用者。

回答

1

認爲這個問題已經打開足夠長的時間:-)

的問題是與我們使用XmlFormView控件的方式。 我選擇實施一種解決方法,而不是改變我們的代碼邏輯。

簡而言之: 我讀這微軟文檔: http://msdn.microsoft.com/en-us/library/microsoft.office.infopath.server.controls.xmlformview.xmlform

其中一段如下:

的XmlForm屬性只能在下列情況之一時進行訪問:

  • 初始化
  • NotifyHost
  • SubmitToHost
  • 關閉

我們的代碼既不這些!

基本上我們會從aspx頁面上的標準按鈕做回傳,並且從後面的代碼嘗試調用XmlFormView1.XmlForm.Submit();

我發現,在Microsoft.Office.Infopath組件使用.net反射,即當試圖提交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();

不是一個漂亮的解決方案,但它的工作原理沒有改變任何其他邏輯。