2011-07-11 2 views
0

J'utilise le contrôle XmlFormView sur une page aspx personnalisée hébergée sur un site SharePoint. Récemment, notre SharePoint a été mis à niveau vers 2010 et après j'ai eu des problèmes avec la validation de formulaire déclenchée par le XmlForm.Submit().XmlForm.Submit() "masque" le message de résultat de la validation?

La page personnalisée repose en fait sur l'exception levée par SharePoint si la validation du formulaire soumis échoue. Le message de validation est formaté et montré à l'utilisateur de manière amicale.

Lorsqu'un formulaire contenant des données non valides fournies par l'utilisateur est envoyé, une "Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException" est renvoyée. Cette exception ne contient pas d'informations sur les champs witch contenant des données invalides. En fait, je m'attendais à une "Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException". (La soumettons est réussie et aucune exception est levée si la forme ne contient pas d'erreurs de validation)

Si je décochez la case « Activer juste mon code (Managed uniquement) » dans Visual Studio et déboguer le formulaire soumettre, je reçois le exception suivante (contient les textes danois):

Microsoft.Office.InfoPath.Server.SolutionLifetime.DataAdapterException a eu lieu
message = Formularen kan ikke afsendes, den fordi indeholder valideringsfejl. Fejlene er angivet med en rød stjerne (obligatoriske felter) eller omgivet af en rød, stiplet streg (ugyldige værdier).

feutre eller Gruppe: MunicipalRealPropertyIdentifier
Fejl: Der må kun angives et bestemt mønster

Source = Microsoft.Office.InfoPath.Server
BypassWatson = true
LogId = 5567
SaveUserSession = false
UserMessage = Formulaire créé par l'utilisateur, fordi den indeholder validingsfejl. Fejlene er angivet med en rød stjerne (obligatoriske felter) eller omgivet af en rød, stiplet streg (ugyldige værdier).

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

OverrideTopLevelMessage = true
StackTrace:
à
Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard (Document document, adaptateur DataAdapter, XPathNavigator subtreeToCheck, Boolean schemaErrorOnly)
InnerException:

C'est bon! L'exception contient des informations sur les erreurs de validation. I Continuez le débogage. L'exception désiré est ré-émise et la sortie se lit comme suit:

étape en: Enjambant procédé sans symboles de la Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard ' étape en: Faire un pas sur la méthode sans symboles 'Microsoft.Office.InfoPath.Server.DocumentLifetime.Document.ExecuteDefaultSubmitAction'

Ceci est encore bon!Je continue le débogage, mais maintenant l'exception d'origine est perdue et l'InfoPathFatalException est renvoyée.

Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException a eu lieu
Message = exception de type 'Microsoft.Office.InfoPath.Server.Util.InfoPathFatalException' a été jeté.
Source = Microsoft.Office.InfoPath.Server
BypassWatson = false
SaveUserSession = false
UserMessage = Der opstod en alvorlig fejl sous formularen de behandlingen af.
StackTrace:
à Microsoft.Office.InfoPath.Server.Util.GlobalStorage.get_CurrentFormId()
InnerException:

La sortie VS lit maintenant:

dans l'étape: Enjambant méthode sans symboles 'Microsoft.Office.InfoPath.Server.SolutionLifetime.DatabaseHelper.CheckErrorBoard' Entrez dans: Méthode de passage sans symboles 'Microsoft.Office.InfoPath.Server.DocumentLifetime.Document.ExecuteDefaultSubmitAction' étape dans: Enjambant méthode sans symboles de Microsoft.Office.InfoPath.Server.DocumentLifetime.OMExceptionManager.ExecuteOMCallWithExceptions '

Je suis tout à fait un novice en matière de SharePoint, mais je pense que ça sent un peu comme un problème de sécurité? Il semble que l'exception d'origine ne soit pas "autorisée" à renvoyer un message à l'appelant.

J'ai essayé d'activer la journalisation complète dans SharePoint, mais lorsque je regarde les journaux dans ".. \ Program Files \ Fichiers communs \ Microsoft Shared \ Extensions serveur Web \ 14 \ LOGS", je ne vois que le " original "exception, pas pourquoi il est écrasé?

Informations complémentaires: Le site fonctionne actuellement avec le paramètre de configuration:

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

Tout le monde a des idées sur cette question?

Sur SharePoint 2007, l'exception souhaitée est renvoyée à l'appelant.

Répondre

1

pense que cette question a été ouverte assez longtemps :-)

Le problème était avec la façon dont nous avons utilisé le contrôle XmlFormView. Au lieu de changer notre logique de code, j'ai choisi d'implémenter une solution de contournement.

En bref: J'ai lu cette documentation Microsoft: http://msdn.microsoft.com/en-us/library/microsoft.office.infopath.server.controls.xmlformview.xmlform

L'une des sections de lecture:

La propriété XmlForm est accessible uniquement pendant l'un des événements suivants:

  • Initialiser
  • NotifyHost
  • SubmitToHost
  • Fermer

Notre code ne aucune de ces!

Fondamentalement, nous faisons une publication à partir d'un bouton standard sur la page aspx, et à partir du code derrière essayer d'appeler XmlFormView1.XmlForm.Submit();

j'ai découvert, en utilisant réflecteur .NET sur l'ensemble Microsoft.Office.InfoPath, que lorsque vous essayez de soumettre HttpContext.Current.Items [ « __ GlobalStorage.FormIds »] devrait contenir au moins un Id forment la forme actuelle, mais à ce moment, il n'a pas encore été défini!

J'ai donc fait le petit « bidouille » pour faire à nouveau le travail de code suivant:

 /// <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; 
       } 
      } 
     } 
    } 

Partout dans le code derrière, avant que je tente d'accéder à XmlFormView1.XmlForm, je viens d'appeler InfoPath2010Hack();

Pas une jolie solution, mais cela fonctionne sans changer aucune autre logique.

Questions connexes