使用Rotativa ViewAsPdf运行Ajax

时间:2016-06-08 12:51:48

标签: .net json ajax wkhtmltopdf rotativa

我的.Net MVC应用程序中有一个带有JsonResult Action的“Localization”控制器。

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

  return Json(data, JsonRequestBehavior.AllowGet);
}

此Controller从资源文件中获取特定的资源字符串,并将其作为Json返回。

我使用基于wkhtmltopdf的nuget软件包“Rotativa”1.7.1版创建了一个pdf。我可以创建Pdf,这不是问题。问题出现了,当我在这个pdf视图上使用Js文件时,这使得对本地化控制器的Ajax调用成为可能。 我的Js在pdf上查看:

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

不管怎么说,即使我使用了wkhtmltopf的海关开关选项,也无法进行JS Ajax调用

  

“ - 无停止慢的脚本”

  

“ - javascript-delay 25000”

当我只是将视图作为视图返回时,我会毫无问题地获得Ajax数据。我没有得到js错误或类似的东西。是否有可能在我的Js上使用Pdf View而不是Ajax获取.Net资源?

帮助我们:)

1 个答案:

答案 0 :(得分:1)

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

我在这里找到两种解决方案。

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

你可以像这样编写一个Helper类。

Foo

然后你可以简单地将Json字符串放在ViewBag中。

bar

在cshtml视图中,您可以在javascript变量中编写它。我把它保存为窗口的子项,所以它的全局可以在你的javascript中访问。

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

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

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