我的应用是在ASP.NET MVC 5
中制作的。用户可以使用显示已过滤数据的搜索表单。现在,我想添加一个按钮,它将导出显示的数据。
为此,我发送Search
对象以查看并将其保存为html。现在,当单击“导出”按钮时,我想将此对象传递给控制器,使用此Search
对象从数据库中获取数据并将结果另存为text
。
问题是我无法将json绑定到c#
对象。那就是我的view
:
<div id="originalForm" style="visibility:hidden">
@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model))
</div>
这是我的ajax
代码:
function exportRaportToCsv() {
var $formData = $('#originalForm').text();
var allIds = getCheckedIds();
var dataToSend = JSON.stringify({
ids: allIds,
search: $formData
});
$.ajax({
type: "POST",
url: '@Url.Action("ExportToCsv", "BankCosts")',
data: dataToSend,
contentType: "application/json; charset=utf-8",
success: function (datar) {
window.location = '/BankCosts/Download?fileGuid=' + response.FileGuid
+ '&filename=' + response.FileName;
},
error: function (xhr) {
},
});
}
这是我的控制器:
[HttpPost]
public ActionResult ExportToCsv(string[] ids, Search search)
{
// search is null here
}
当我用Fiddler
监视发送数据时,可以看到,这是我通过的:
{"ids":[],"search":"\n {\"ID\":0,\"DateFrom\":\"2018-06-23T00:00:00\",\"DateTo\":\"2018-06-25T00:00:00\",\"hasUnrecognizedStatus\":false,\"skippedSearchResults\":0,\"paginationLimit\":100}\n"}
我认为值得一提的是ids
已正确通过。如果包含数据,则传递该数据。我认为问题是我的\
中有json
。我该如何删除?我的ajax
有什么问题吗?
当我使用console.log
打印$formData
时,我看到\
字符消失了,看起来更好了:
{"ID":0,"DateFrom":"2018-06-23T00:00:00","DateTo":"2018-06-25T00:00:00","hasUnrecognizedStatus":false,"skippedSearchResults":0,"paginationLimit":100}
答案 0 :(得分:0)
[HttpPost]
public ActionResult ExportToCsv(string[] ids,[FromBody]Search search)
{
}
如果您的搜索模型还可以,请尝试添加FromBody。
答案 1 :(得分:0)
根据您的评论,我认为搜索对象已经进行了字符串化,因此您无需对其进行字符串化。
只需将您的json设为
var dataToSend = {
"ids": allIds,
"search": $formData
};
答案 2 :(得分:0)
使用JSON.parse()将JSON字符串转换为JavaScript对象。您的$('#originalForm')。text()实际上是JSON字符串。
var $formData = JSON.parse($('#originalForm').text());
var allIds = getCheckedIds();
var dataToSend = JSON.stringify({
ids: allIds,
search: $formData
});
在您的情况下,$ formData是一个字符串(实际上是JSON字符串)。因此,JSON.stringify()再次尝试转换为JSON字符串,该字符串已经是JSON字符串,导致您要发布的表单数据中不必要的'/'字符。
确保在ajax调用属性中将内容类型设置为“ application / json”,否则MVC模型绑定程序将无法从JSON发布的数据映射和填充.NET模型。 contentType:“ application / json; charset = utf-8”,
答案 3 :(得分:-1)
因为您正在使用
JSON.stringify
以字符串格式而不是对象发布的搜索值
搜索
如此
尝试以此替换您的控制器
[HttpPost]
public ActionResult ExportToCsv(string[] ids, string search)
{
//then deserialize search json like
Search objSearch = JsonConvert.DeserializeObject<Search>(search);
}
或
[HttpPost]
public ActionResult ExportToCsv(string[] ids, JObject search)
{
//then deserialize search json like
Search objSearch = JsonConvert.DeserializeObject<Search >
(dataModel["search"].ToString());
}
查看
$.ajax({
type: "POST",
url: '@Url.Action("ExportToCsv", "BankCosts")',
data:{ids= allIds.toString(),search:JSON.stringify($formData)}
contentType: "application/json; charset=utf-8",
success: function (datar) {
window.location = '/BankCosts/Download?fileGuid=' + response.FileGuid
+ '&filename=' + response.FileName;
},
error: function (xhr) {
},
});