我的.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资源?
帮助我们:)
答案 0 :(得分:1)
似乎Rotativa不支持ajax调用。并且因为该网站由Rotativa处理而不是在浏览器中处理,所以没有办法解决这个问题。这也是您在浏览器控制台中没有显示js错误的原因。
我在这里找到两种解决方案。
你可以像这样编写一个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();