2011-07-11 8 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はvalideringsfejl indeholder
メッセージ= Formularen館ikke afsendes、fordiデン発生しました。 (義務を負う)義務を負うことがあり、義務を負うことはありません。

フェルトEllerののGRUPPE:MunicipalRealPropertyIdentifier
Fejl:デアMAくんangivesらbestemtモンスター

ソース= Microsoft.Office.InfoPath.Server
BypassWatson =真
LOGID = 5567
SaveUserSession = falseを
UserMessage =すべてのユーザーのためにフォームを作成してください。 (義務を負う)義務を負うことがあり、義務を負うことはありません。

フェルトEllerののGRUPPE:MunicipalRealPropertyIdentifier
Fejl:デアMAくんangivesらbestemtモンスター

OverrideTopLevelMessage =真
のStackTrace:

Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoardで(文献ドキュメント、DataAdapterアダプタ、XPathNavigatorサブツリーチェック、ブール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
BypassWatson = falseを
SaveUserSession = falseを
UserMessage =デアopstodエンalvorlig fejl behandlingen AF formularen下。
のStackTrace: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

一つは読み: 私はこのMicrosoftのドキュメントを読んで

XmlFormプロパティは、のみ、以下のいずれかのイベント中にアクセスすることができます

  • 初期化
  • NotifyHost
  • SubmitToHost
  • 閉じる

私たちのコードは、これらのいずれを行います!

基本的に、aspxページの標準ボタンからポストバックを行い、コードの背後にあるXmlFormView1.XmlForm.Submit();をコールしようとします。

私は形成HttpContext.Current.Itemsを提出しようとしている[「__ GlobalStorage.FormIds」]は、少なくとも1つのIDを含むことが期待されていることを、Microsoft.Office.Infopathアセンブリで.NETリフレクターを使用して、見つけました現在の形ですが、現時点ではまだ設定されていません!

だから私は再びコードを機能させるために、次の少し「汚いハック」をやった:

 /// <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()を呼び出します。

かなりの解決策ではありませんが、他のロジックを変更することなく動作します。

関連する問題