2016-06-27 2 views
1

Я пытаюсь вызвать URL для преобразования объекта в файл первенствовать быть загружены клиентом, поэтому я использую следующий HTML:Объект принимается в нуль от формы POST

<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(); 

И, наконец, следующий .cs контроллера:

public ActionResult DownloadFile(string token, wcfGlobal.complexObjectRequest complexObject) 
{ 
    ... 
} 

к веро lem У меня есть то, что токен получен просто отлично (это просто строка); однако complexObject принимается как нуль.

Кто-нибудь знает, как я могу решить эту проблему? Обычно я использую jQuery.ajax(...) для этих типов запросов, но, учитывая, что мне нужно напрямую загрузить файл, у меня нет этой опции.

+0

Контроллер имеет тип 'Controller' (например MVC) или' ApiController'? –

+0

@TasosK. К сожалению, это тип Controller – user3645275

+0

Я должен, вероятно, упомянуть, что есть также массивы отправленного объекта. Я обновил часть .js, чтобы отразить это. – user3645275

ответ

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 li ка это

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

    } 
} 
+0

О, ничего себе, я был манекеном. Спасибо за помощь! Кстати, знаете ли вы, как метод ajax jQuery передает объекты в webservices? И если есть способ сделать это с помощью форм? – user3645275

+0

Рад, что я помог! Когда вы говорите webservices, вы имеете в виду '.asmx'? Если да, см. [Этот пост] (http://codehandbook.org/call-asmx-web-service-from-jquery-ajax/) о том, как вызвать их с помощью jQuery ajax. Со своей стороны, как назвать их формами, я уверен, как это будет работать, поскольку простой HTTP POST имеет «Content-Type: application/x-www-form-urlencoded», где '.asmx' ожидает' Content -Тип: application/json' –

+0

Я понимаю, что вы имеете в виду. В этом есть смысл. Еще раз спасибо! – user3645275

0

Переменная complexObjectStr должна быть строкой, потому что после того, как вы используете stringify функцию, это значение строка (не объект). И в вашем действии (в контроллере) вам нужно Deserialize эту строку в wcfGlobal.complexObjectRequest.

Смежные вопросы