2011-01-14 4 views
0

Dies ist streng ein IE7 Problem; IE8 macht nichts und FF auch nicht. Unsere Form wirft die folgende Ausnahme bei der Einreichung:JSON-Fehler beim Senden in IE7 (und nur IE7): "Kann nicht deserialisiert werden. Die Daten entsprechen keinem gültigen JSON."

Sys.ArgumentException: Cannot deserialize. The data does not correspond to valid JSON. 
Parameter name: data 

Formularkopf (für Geheimhaltung bearbeitet, wir eine paranoide NDA haben):

<%using (Ajax.BeginForm("...", "...", FormMethod.Post, 
    new AjaxOptions { 
     OnComplete = "OnSaveEditCommunitySuccess", 
     OnBegin = "OnBegin" }, 
    new { id = "form_Edit...", name = "form_Edit..." })) 

ich vorübergehend einen Handler OnBegin angebracht ist, und schaute auf die json Objekt, das herumgereicht wird. Ich kann garantieren, json.get_request().get_body() ist identisch zu dem, was in FF geschieht, und ordnungsgemäß Web codiert:

ProfileTabModel.IsEdit=true&ProfileTabModel.HandEnterCommunity=true&ProfileTabModel.CommunityId=26&ProfileTabModel.County=&ProfileTabModel.OrgId=7395& (...) 

Es könnte von Bedeutung sein, dass dies eine große Form ist, und die gesendeten Daten mindestens 2500 Bytes. Mir ist klar, dass es in einem POSt keine Rolle spielen sollte, und selbst wenn es so wäre, hat es nichts mit dem gemeldeten Fehler zu tun, aber erwähne es am besten, da andere Formulare, die auf demselben Muster geschrieben sind, keine Probleme haben, ihre Daten zu veröffentlichen.

[EDIT:] Wenn auf Debug ausgeführt wird, gibt IE7 die Aktion in dem Controller nicht ein, während alles andere tut. Vergessen, dies zu erwähnen.

+0

Kannst du den eigentlichen JSON posten? – JeremyP

+0

Ich würde es gerne zuerst finden. Ich meine, ich kann durch die HTTP-Anfrage gut graben, und ich kann sehen, dass es nie die Aktionsmethode in den Controller eingibt. Aber ich weiß nicht einmal, worüber JSON es spricht. – Liz

+0

Sie könnten versuchen, alle Json-Aufrufe zu ändern, um zu protokollieren, was sie zu verschlüsseln versuchen, und wenn es erfolgreich ist, fügen Sie eine neue Zeile mit 'succes' – gnur

Antwort

3

Lösung und Zusammenfassung:

Das Problem tritt auf, wenn es Zeit, den Submit-Button zu kodieren ist. Unsere Tasten werden als <button ... ><span> Submit</span></button> generiert; Wenn es an der Zeit ist, die Anfrage zu erstellen, sind alle anderen Browser, IE8, intelligent genug, um nur "Submit" zu verwenden. IE7 sendet alles innere HTML. Wir hatten diesen Fehler in anderen Kontexten, aber dieses Mal wurde ich durch den JSON-Fehler auf einen falschen Pfad gesetzt.

Ich kann und werde nicht von <% Http.Button %> zu einem Eingang wechseln; es ist mir ein Rätsel, wie das überhaupt als eine brauchbare Lösung angesehen werden könnte; Diese Erweiterung wird aus sehr guten Gründen verwendet, und wenn ich sie wegwerfen würde, hätte ich diese Frage nicht gestellt.

Die Lösung bestand darin, einen neuen Filter hinzuzufügen, RequestValidator zu erweitern, und die Anforderung für das problematische span-Tag zu überprüfen; Wenn es gefunden wird, ersetzen Sie es durch den Text.

public class HttpRequestValidator : RequestValidator 
{ 
    protected override bool IsValidRequestString(
      HttpContext context, 
      string value, 
      RequestValidationSource requestValidationSource, 
      string collectionKey, 
      out int validationFailureIndex) 
    { 
     // Check if the Request.QueryString contains a post value of "<span>.....</span>" 
     if (requestValidationSource == RequestValidationSource.Form 
       && !string.IsNullOrEmpty(value) && value.StartsWith("<span>", 
      StringComparison.InvariantCultureIgnoreCase)) 
     { 
      var match = Regex.Match(value, @"\A<span>(.*?)</span>\Z", 
       RegexOptions.IgnoreCase); 
      if (match.Success && match.Groups.Count > 1) 
       return base.IsValidRequestString(
        context, match.Groups[1].Value, 
        requestValidationSource, 
        collectionKey, 
        out validationFailureIndex); 

     } 

     return base.IsValidRequestString(
      context, 
      value, 
      requestValidationSource, 
      collectionKey, 
      out validationFailureIndex); 
    } 
} 

Sie müssen es auch hinzufügen in web.config; suche nach httpRuntime und ersetze ihn durch

<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,:,\" 
    requestValidationType=" ... .HttpRequestValidator" 
    maxRequestLength="40920" maxQueryStringLength="10000"/> 
0

Vielleicht sollten Sie lieber ein normales "Eingabe" -Tag mit Button-Typ verwenden, da es sich in einem Formular befindet. Anscheinend nimmt IE 7 den inneren HTML-Wert des Buttons als Wert, während viele andere Browser das "value" -Attribut verwenden.

+0

Auf die Gefahr hin, unhöflich zu sein: Wenn jemand ein Problem mit einem Controller oder einer Nebenstelle hat, ist die richtige Antwort niemals "Stoppt die Verwendung des Controllers"; Wenn das eine akzeptable Lösung wäre, hätte ich das getan und die Frage überhaupt nie eröffnet. Es macht nichts, ein Kopfgeld darauf zu legen. – Liz

1

Sie müssen Ihren JSON-Code in http://jsonlint.com/ kopieren/einfügen, um seine Gültigkeit zu überprüfen und das Problem zu sehen.

+0

Ein sehr guter Link zu erinnern, aber ich habe das Problem mit dem JSON 5 Tage vor Ihrem Post, im ursprünglichen Post-Kommentar ... – Liz