2016-06-08 26 views
1

Ich habe in meiner .Net MVC Anwendung einen "Lokalisierungs" Controller mit einer JsonResult Action.Ajax läuft nicht mit Rotativa ViewAsPdf

Dieser Controller ruft eine spezifische Ressourcenzeichenfolge aus der Ressourcendatei ab und gibt sie als Json zurück.

Ich erstelle ein pdf mit dem nugget Paket "Rotativa" Version 1.7.1 basierend auf wkhtmltopdf. Ich kann das PDF erstellen, das ist nicht das Problem. Das Problem kommt, wenn ich Js-Dateien auf dieser pdf-Ansicht verwenden, die Ajax-Aufrufe auf die Lokalisierung Controller abve macht .. My Js auf der Ansicht pdf:

var dataValues = ""; 
$.getJSON("/Localization/Index/" + "resourceStringXY", function (data) { 
    dataValues = data; 
    myFunction(); 
}); 

Mein rotativa Pdf Controller:

return new ViewAsPdf("PdfView", model) 
{ 
    FileName = "PdfName.pdf", 
    PageMargins = new Margins(15, 20, 15, 0), 
    IsJavaScriptDisabled = false, 
    CustomSwitches = cs 
}; 

Irgendwie ist der JS Ajax-Aufruf kann nicht gemacht werden, auch wenn ich die wkhtmltopf customswitch Optionen

"--no-stop-slow-Skripte" verwenden

und

"--javascript-Verzögerung 25000"

Wenn ich einfach die Ansicht als Ansicht zurückzukehren, erhalte ich die Ajax-Daten ohne Probleme. Ich bekomme keinen js Fehler oder so etwas. Gibt es vielleicht eine Möglichkeit, .Net Ressourcen in meinem Js auf der Pdf View statt Ajax zu bekommen?

Thx für die Hilfe :)

Antwort

1

Es scheint, wie rotativa nicht Ajax-Aufrufe unterstützt. Und weil die Website von Rotativa und nicht in einem Browser oder etwas anderem verarbeitet wird, gibt es keine Möglichkeit, dies zu beheben. Und das ist auch der Grund, warum Sie keine Fehlermeldung in Ihrer Browser-Konsole erhalten.

Ich sehe zwei Lösungen für Sie.

  • die PDF generieren anders
  • Serialize alle Saiten in ein JSON-String und in den HTML setzen. Von dort benutze Javascript, um es erneut zu lesen.

Sie könnten eine Helper-Klasse wie folgt schreiben.

public class TranslationStrings 
{ 
    public Dictionary<string, string> Strings { get; set; } 

    public TranslationStrings() 
    { 
     //init translation dictionary in constructor 
     Strings = new Dictionary<string, string> 
     { 
      //All the keys you need 
      {"resourceStringXY" , Resources.General.resourceStringXY}, 
      {"resourceStringAB" , Resources.General.resourceStringAB} 
     }; 
    } 

    //simple Method to serialize the dictionary. 
    public string GetJsonString() 
    { 
     JavaScriptSerializer js = new JavaScriptSerializer(); 
     return js.Serialize(Strings); 
    } 
} 

Dann können Sie einfach die Json-Zeichenfolge in den ViewBag wie folgt setzen.

ViewBag.translations = new TranslationStrings().GetJsonString(); 

In der cshtml-Ansicht können Sie es in eine Javascript-Variable schreiben. Ich speichere es als ein Kind des Fensters, so dass es global in dir javascript verfügbar ist.

<script type="text/javascript"> 
    window.translations = @(Html.Raw(ViewBag.translations)); 
</script> 

Dann sollten Sie verfügbar sein, um auf die Zeichenfolge wie folgt zuzugreifen.

window.translations["resourceStringXY"]