从表单POST

时间:2016-06-27 15:59:07

标签: javascript html asp.net asp.net-mvc web-services

我正在尝试调用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)
{ 
    ...
}

我遇到的问题是收到的令牌很好(它只是一个简单的字符串);但是,complexObject被视为空。

有谁知道如何解决这个问题?我通常只使用jQuery.ajax(...)来处理这些类型的请求,但考虑到我需要直接下载文件,我在这里没有这个选项。

2 个答案:

答案 0 :(得分:1)

您在发送之前序列化req对象,因此它将作为字符串发送。没有办法自动对complexObject进行反序列化。

我看到它的方式你可以继续将复杂对象作为字符串发送并在控制器中反序列化

<强> 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()
    {

    }
}

答案 1 :(得分:0)

complexObjectStr变量应该是一个字符串,因为在使用stringify函数之后,该值是字符串(不是对象)。 在您的操作中(在控制器中),您必须将该字符串反序列化为wcfGlobal.complexObjectRequest。