Jquery 在不使用Ajax的情况下向MVC控制器提交JSON
我在一个页面上有几个Jquery 在不使用Ajax的情况下向MVC控制器提交JSON,jquery,ajax,asp.net-mvc,json,Jquery,Ajax,Asp.net Mvc,Json,我在一个页面上有几个字段来收集用户输入。该页面使用jQuery选项卡。一旦用户输入完数据,他们就进入下一个jQuery选项卡,直到最后一个选项卡显示通过Ajax检索到的信息。这一页永远不会刷新 上面的方法很好,但现在我实现了一个选项,用户可以将结果转换为PDF格式,以便保存或打印。最初,触发PDF转换的jQuery是: $('#btnViewPrintSavePDF').click(function (event) { event.preventDefault; $(this)
字段来收集用户输入。该页面使用jQuery选项卡。一旦用户输入完数据,他们就进入下一个jQuery选项卡,直到最后一个选项卡显示通过Ajax检索到的信息。这一页永远不会刷新
上面的方法很好,但现在我实现了一个选项,用户可以将结果转换为PDF格式,以便保存或打印。最初,触发PDF转换的jQuery是:
$('#btnViewPrintSavePDF').click(function (event) {
event.preventDefault;
$(this).parents("form")
.attr("method", "POST")
.attr("action", "/Controller/ConvertToPDF");
.submit();
});
在控制器中:
[HttpPost]
public ActionResult ConvertToPDF()
{
object model = null;
ViewDataDictionary viewData = new ViewDataDictionary(model);
viewData.Add("MyValue1", Request["MyValue1"]);
viewData.Add("MyValue2", Request["MyValue2"]);
viewData.Add("MyValue3", Request["MyValue3"]);
// The string writer where to render the HTML code of the view
StringWriter stringWriter = new StringWriter();
// Get the base URL
String currentPageUrl = this.ControllerContext.HttpContext.Request.Url.AbsoluteUri;
String baseUrl = currentPageUrl.Substring(0, currentPageUrl.Length - "Controller/PDFTemplate".Length);
viewData.Add("BaseUrl", baseUrl);
// Render the Index view in a HTML string
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, "PDFTemplate", null);
ViewContext viewContext = new ViewContext(
ControllerContext,
viewResult.View,
viewData,
new TempDataDictionary(),
stringWriter
);
viewResult.View.Render(viewContext, stringWriter);
// Get the view HTML string
string htmlToConvert = stringWriter.ToString();
// Create a HTML to PDF converter object with default settings
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "...hidden...";
// Convert the HTML string to a PDF document in a memory buffer
byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlToConvert, baseUrl);
// Send the PDF file to browser
FileResult fileResult = new FileContentResult(outPdfBuffer, "application/pdf");
fileResult.FileDownloadName = "MyPDF.pdf";
return fileResult;
}
同样,上面的代码工作正常。发生.cshtml视图的PDF转换,我会收到一个常见对话框的提示,询问我是要打开PDF还是保存它
请注意,原始页面永远不会刷新,这就是它需要保持的方式
问题:
我有一个在原始页面中创建的Json对象/字符串。它需要与所有表单字段(复选框、文本等)一起提交到上面的ConvertToPDF()
例程。我不知道该怎么做
Ajax中断了ConvertToPDF(),因为对话框不再弹出询问您是否要打开或保存PDF的对话框
我的目的是在ConvertToPDF()
中包含以下代码:
那么,如何将groupchoiceid
Json字符串提交到ConvertToPDF()
,而不引起页面刷新,也不破坏打开/保存功能
编辑
我已经尝试将Json字符串放置在一个隐藏的
字段中,但是该字段没有被提交,并且在表单提交后也没有显示在控制器中。输入字段如下所示:
$.ajax({
type: "POST",
url: "/Central/ConvertToPDF",
dataType: "json",
data: {
GroupChoiceIds: ('{ 'Key1' : 'Value1', 'Key2' : 'Key2', 'Key3' : 'Value3','SpecialKey1' : 'Special_|_Value' }')
},
....
});
<input type="hidden" value="{ 'Key1' : 'Value1', 'Key2' : 'Value2', 'Key3' : 'Value3', 'SpecialKey' : 'Special_|_Value' }" id="GroupChoiceIds">
及
您可以使用相对现代的浏览器支持的数据URI方案。这允许您创建一个特殊的URL,该URL不引用外部资源,而是包含编码数据本身
也就是说,我们的想法是使用AJAX下载数据,并组成一个包含该数据的特殊url。在这个答案中,
属性使用特殊的URL。但是您可以在常规链接()中公开它。URL在“文件系统:URL”部分中有说明。将组选项ID添加为第二个表单中的隐藏控件
<input id="GroupChoiceIds" type="hidden" value="" name="GroupChoiceIds"/>
并在ajax调用之前在form submit事件中更新其值$('#groupChoiceId').val(jsonStringVal)
。在MVC操作中,使用请求[“groupChoiceId”]访问它,并使用JSON.NET库反序列化jsonString。将groupChoiceId
添加为表单中的隐藏控件,并更新其值,如$(“#GroupChoiceId”).val(jsonStringVal)
并提交表单。在MVC操作中,使用请求[“GroupChoiceId”]访问表单
我把它放在一个type=hidden输入字段中,但当我打开控制器时,它总是显示为null。在hidden field control中使用静态值进行测试,记住把这个控件放在
tag@cackharot中,起初我以为我可能把这个字段放在end form标记之外,但我没有。我已经仔细检查了所有内容ng,基本上它看起来是正确的-除了我不确定|
是否可能导致问题?
name
属性很重要这是浏览器提交给服务器的密钥。希望这有帮助!我已经记下了你的答案,可能需要使用其中一种方法。谢谢。我还编辑了我的问题并包括输入字段的源代码。你是说输入字段的值不起作用,我需要使用另一种方法吗?如果在隐藏字段中使用JSON,则不会自动绑定:控制器将接收JSON字符串,并且必须反序列化,例如使用JSON.NET。我认为前面的选项更好。我已经用一个附加选项更新了答案。感谢您提供了这些选项。我已经浏览了您提供的2个链接。我知道这些方法有一个位置,但上面的cackharot为我提供了解决问题的最简单方法-包括名称
属性。我已经习惯于在jQuery和使用razor helpers,我完全忘记了在发布到服务器时使用了name属性。它完全解决了我的问题。我认为你的问题真的令人困惑。你说的是这两个问题:“Ajax破坏了ConvertToPDF(),因为对话框不再弹出询问是否要打开或保存PDF的对话框”,“那么,如何将GroupChoiceId Json字符串提交到ConvertToPDF(),而不导致页面刷新,也不破坏打开/保存功能?"Ajax本身不会弹出对话框,因此添加name属性并不能解决这些问题。如果您唯一的问题是没有发布值,请将您的问题说得更清楚,以便对其他人有用。2人试图帮助我。1人似乎理解问题,或者至少看到t的问题他是我发布的代码。谢谢你的帮助。很抱歉,你没有理解这个问题。你对我的问题的缩写似乎把我的问题描述为不清楚。我认为你应该重读这个问题。
<input id="GroupChoiceIds" type="hidden" value="" />
@Html.Hidden("GroupChoiceIds")
<input id="GroupChoiceIds" type="hidden" value="" name="GroupChoiceIds"/>