我正在尝试调用 URL 将对象转换为可供客户端下载的 Excel 文件,因此我使用以下 HTML:
<form id="downloadAsExcelForm" style="display: none;" action="global/DownloadFile" method="POST">
<input id="downloadToken" type="hidden" name="token" value="" />
<input id="complexObject" type="hidden" name="complexObject" value="" />
</form>
以及以下 JavaScript:
var req = {
param1: "Example",
param2: 1,
param3: [ { attr1: "test", attr2: 1, attr3: "Hello" },
{ attr1: "test", attr2: 1, attr3: "Hello" },
{ attr1: "test", attr2: 1, attr3: "Hello" } ]
};
$("#downloadToken").val("nhwe1-jdw3e-djdw2-mkcds");
$("#complexObject").val(JSON.stringify(req));
$("#newQueryForm").submit();
最后,以下 Controller .cs:
public ActionResult DownloadFile(string token, wcfGlobal.complexObjectRequest complexObject)
{
...
}
我遇到的问题是 token 接收得很好(它只是一个简单的字符串);然而,complexObject
被接收为 null。
有谁知道我该如何解决这个问题?我通常只使用 jQuery.ajax(...)
来处理这些类型的请求,但考虑到我需要直接下载文件,我这里没有这个选项。
最佳答案
您在发送req
对象之前对其进行序列化,因此它作为字符串发送。没有办法自动反序列化complexObject
。
在我看来,您可以继续将复杂对象作为字符串发送并在 Controller 中反序列化
HTML
<form id="downloadAsExcelForm" style="display: none;" action="global/DownloadFile" method="POST">
<input id="downloadToken" type="hidden" name="token" value="" />
<input id="complexObject" type="hidden" name="complexObjectStr" value="" />
</form>
C#
// Required reference
using System.Web.Script.Serialization;
public ActionResult DownloadFile(string token, string complexObjectStr)
{
wcfGlobal.complexObjectRequest complexObject = new JavaScriptSerializer().Deserialize<wcfGlobal.complexObjectRequest>(complexObjectStr);
// Now complexObject has the values you sent from the browser
}
根据您发布的 JavaScript,complexObjectRequest
类需要这样声明
public class complexObjectRequest
{
public string param1 { get; set; }
public int param2 { get; set; }
public List<Param3> param3 { get; set; }
public complexObjectRequest()
{
}
}
public class Param3
{
public string attr1 { get; set; }
public string attr2 { get; set; }
public string attr3 { get; set; }
public Param3()
{
}
}
关于javascript - 从表单 POST 中接收到的对象为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38058437/