【问题标题】:Object being received as null from form POST从表单 POST 接收为 null 的对象
【发布时间】:2016-06-27 15:59:06
【问题描述】:

我正在尝试调用 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 被接收为 null。

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

【问题讨论】:

  • 控制器的类型是Controller(例如MVC)还是ApiController?
  • @TasosK。糟糕,它是控制器类型
  • 我可能应该提一下,还有对象数组正在发送。我更新了 .js 部分以反映这一点

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


【解决方案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()
    {

    }
}

【讨论】:

  • 哦,哇,我是个傻瓜。谢谢您的帮助!顺便问一下,你知道 jQuery 的 ajax 方法是如何将对象传递给 webservices 的吗?如果有任何方法可以使用表单?
  • 很高兴我能帮上忙!当您说 Web 服务时,您的意思是 .asmx?如果是这样,请参阅this post,了解如何使用 jQuery ajax 调用它们。关于如何用表单调用它们的部分,我不确定这是如何工作的,因为普通的 HTTP POST 有 Content-Type: application/x-www-form-urlencoded 其中 .asmx 需要 Content-Type: application/json
  • 我明白你的意思。这就说得通了。再次感谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 2010-12-16
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多