2016-06-08 96 views
1

我在我的.Net MVC应用程序中有一个带有JsonResult操作的“本地化”控制器。Ajax没有运行Rotativa ViewAsPdf

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

    return Json(data, JsonRequestBehavior.AllowGet); 
} 

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

我创建了一个基于wkhtmltopdf的nuget包“Rotativa”版本1.7.1的pdf。我可以创建PDF,这不是问题。问题来了,当我使用这个PDF浏览,这使得Ajax调用到本地化控制器abve JS-文件.. 我的js的PDF查看:

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

我Rotativa全文控制器:

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

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

“--no一站式慢脚本”

“--javascript延迟25000”

当我只是返回查看视图,我得到没有任何问题的Ajax数据。我没有得到一个JS错误或类似的东西。在我的Js上使用Pdf视图而不是Ajax可能有任何可能性来获取.Net资源?

THX帮助:)

回答

1

好像Rotativa不支持Ajax调用。由于该网站由Rotativa处理,而不是浏览器或其他东西,因此无法解决此问题。这也是为什么你的浏览器控制台没有显示js错误的原因。

我在这里看到两个解决方案给你。

  • 生成PDF不同
  • 序列化您的所有字符串成JSON字符串,并把它放到HTML。从那里使用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); 
    } 
} 

然后,你可以简单地把JSON字符串放在ViewBag中,像这样。

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

在cshtml视图中,您可以将它写入JavaScript变量中。我把它保存为一个窗口的孩子,所以它全局可访问你的JavaScript。

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

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

window.translations["resourceStringXY"]