Ajax 不是 运行 Rotativa ViewAsPdf

Ajax is not running with Rotativa ViewAsPdf

我的 .Net MVC 应用程序中有一个 "Localization" 带有 Json 结果操作的控制器。

[HttpGet]
public ActionResult Index(string id)
{
  var data = JsonConvert.DeserializeObject("\"" +  ResourceHelper.GetString(id) + "\"");

  return Json(data, JsonRequestBehavior.AllowGet);
}

此控制器从资源文件中获取特定的资源字符串,并return将其作为Json。

我使用基于 wkhtmltopdf 的 nuget 包 "Rotativa" 版本 1.7.1 创建了一个 pdf。我可以创建 Pdf,这不是问题所在。问题来了,当我在此 pdf 视图上使用 Js 文件时,它对本地化控制器进行 Ajax 调用 abve.. 我在 pdf 视图上的 Js:

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

我的 Rotativa Pdf 控制器:

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

无法进行 JS Ajax 调用,即使我使用 wkhtmltopf customswitch 选项

"--no-stop-slow-scripts"

"--javascript-delay 25000"

当我简单地 return 视图作为视图时,我得到 Ajax 数据没有任何问题。我没有收到 js 错误或类似的错误。是否有可能在 Pdf 视图而不是 Ajax 的我的 Js 中获取 .Net 资源?

感谢您的帮助:)

Rotativa 似乎不支持 ajax 调用。而且因为该网站是由 Rotativa 处理的,而不是在浏览器或其他东西中处理的,所以没有办法解决这个问题。这也是为什么您在浏览器控制台中没有显示 js 错误的原因。

我在这里为您找到两个解决方案。

  • 以不同方式生成 PDF
  • 将你所有的字符串序列化为一个json字符串并放入HTML。从那里使用 javascript 再次阅读。

你可以像这样写一个 Helper class。

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

然后你可以像这样简单地将 Json 字符串放入 ViewBag 中。

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

在 cshtml 视图中,您可以将其写入 javascript 变量中。我将其保存为 window 的子项,因此您可以在 javascript.

中全局访问它
<script type="text/javascript">
    window.translations = @(Html.Raw(ViewBag.translations));
</script>

你应该可以像这样访问字符串。

window.translations["resourceStringXY"]