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"/>