Hi I have a JS Knockout View Model posting back to my asp web app a Json Object which looks like this
[
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000003774|0003",
"Requisition": "0000003774",
"ReqnStatus": "Approved awiting Purchase Order",
"DateReqnRaised": "2018-03-15T00:00:00",
"ReqnValue": 573.4,
"ApprovedValue": 0.0,
"Originator": "*",
"OrigName": "**********",
"OrigEmail": "********@exidor.co.uk",
"Line": 3.0,
"INDX": 1,
"DateReqnRaisedL": "15/03/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
},
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000004304|0001",
"Requisition": "0000004304",
"ReqnStatus": "Approved awiting Purchase Order",
"DateReqnRaised": "2018-08-06T00:00:00",
"ReqnValue": 550.0,
"ApprovedValue": 0.0,
"Originator": "*",
"OrigName": "********",
"OrigEmail": "********@exidor.co.uk",
"Line": 1.0,
"INDX": 2,
"DateReqnRaisedL": "06/08/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
},
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000004434|0001",
"Requisition": "0000004434",
"ReqnStatus": "Awaiting Approval",
"DateReqnRaised": "2018-09-19T00:00:00",
"ReqnValue": 0.0,
"ApprovedValue": 0.0,
"Originator": "*",
"OrigName": "********",
"OrigEmail": "********@exidor.co.uk",
"Line": 1.0,
"INDX": 3,
"DateReqnRaisedL": "19/09/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
},
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000004550|0001",
"Requisition": "0000004550",
"ReqnStatus": "Approved awiting Purchase Order",
"DateReqnRaised": "2018-10-30T00:00:00",
"ReqnValue": 42.32,
"ApprovedValue": 0.0,
"Originator": "*",
"OrigName": "********",
"OrigEmail": "********@exidor.co.uk",
"Line": 1.0,
"INDX": 4,
"DateReqnRaisedL": "30/10/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
},
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000004645|0001",
"Requisition": "0000004645",
"ReqnStatus": "Awaiting Approval",
"DateReqnRaised": "2018-11-30T00:00:00",
"ReqnValue": 250.56,
"ApprovedValue": 0.0,
"Originator": "*",
"OrigName": "********",
"OrigEmail": "********@exidor.co.uk",
"Line": 1.0,
"INDX": 5,
"DateReqnRaisedL": "30/11/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
},
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000004659|0001",
"Requisition": "0000004659",
"ReqnStatus": "Approved awiting Purchase Order",
"DateReqnRaised": "2018-12-04T00:00:00",
"ReqnValue": 228.15,
"ApprovedValue": 0.0,
"Originator": "*",
"OrigName": "********",
"OrigEmail": "********@exidor.co.uk",
"Line": 1.0,
"INDX": 6,
"DateReqnRaisedL": "04/12/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
},
{
"ID": "GRP2-SYSPRO|SysproComapnyF|0000004661|0001",
"Requisition": "0000004661",
"ReqnStatus": "Approved awiting Purchase Order",
"DateReqnRaised": "2018-12-05T00:00:00",
"ReqnValue": 528.0,
"ApprovedValue": 0.0,
"Originator": "***",
"OrigName": "********",
"OrigEmail": "********@exidor.co.uk",
"Line": 1.0,
"INDX": 7,
"DateReqnRaisedL": "05/12/18",
"ReqStatus": "W",
"ReqBackground": "card-heading bg-primary text-white"
}
]
The controller is to receive this item and convert it into XML Ideally something like this
<data>
<row>
<id>GRP2-SYSPRO|SysproComapnyF|0000004334|0003</id>
<requisition>0000004334</requisition>
<reqnStatus>Awaiting Approval</reqnStatus>
<dateReqnRaised>2018-08-15T00:00:00</dateReqnRaised>
etc
</row>
<row>
<id>GRP2-SYSPRO|SysproComapnyF|0000004340|0005</id>
<requisition>0000004340</requisition>
<reqnStatus>Awaiting Approval</reqnStatus>
<dateReqnRaised>2018-08-27T00:00:00</dateReqnRaised>
etc
</row>
</data>
Can this be done?
The conversion in the controller is handled by
XmlDocument doc = JsonConvert.DeserializeXmlNode(json.ToString());
At first this code I used in the controller could not serialise the xml because there was no root, the error message I received was
"typeName": "Newtonsoft.Json.JsonSerializationException", "message": "XmlNodeConverter can only convert JSON that begins with an object. Path '', line 1, position 1.",
I then amend my view model code as per here so my post command became
self.postAllReqs = function(self) {
self.error(''); // Clear error message
var data = JSON.stringify({ data: ko.toJSON(self.Reqs) }); // convert to json
ajaxHelper(reqsUri, 'POST', data).fail(function (jqXHR, textStatus, errorThrown) {
self.error(errorThrown);
});
}
The ajax Helper function is
function ajaxHelper(uri, method, data) {
self.error(''); // Clear error message
return $.ajax({
type: method,
url: uri,
dataType: 'json',
contentType: 'application/json',
data: data ? JSON.stringify( data ) : null //var json = JSON.stringify({ data: data });
}).fail(function (jqXHR, textStatus, errorThrown) {
self.error(errorThrown);
});
}
However this now posts the payload back as
{"rows":"[{"id":"GRP2-SYSPRO|SysproComapnyF|0000003861|0001","requisition":"0000003861","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-04-06T00:00:00","reqnValue":29.3,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":1,"dateReqnRaisedL":"06/04/18","reqStatus":"A","reqBackground":"card-heading bg-success text-white","reqStatusLabel":"Approved","approvalBtn":"css: button btn-secondary ","approvalBtnLbl":"UnApprove","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004013|0002","requisition":"0000004013","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-05-17T00:00:00","reqnValue":60,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":2,"indx":2,"dateReqnRaisedL":"17/05/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004427|0001","requisition":"0000004427","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-09-17T00:00:00","reqnValue":34.73,"approvedValue":null,"originator":"***","origName":"*****","origEmail":"*****@exidor.co.uk","line":1,"indx":3,"dateReqnRaisedL":"17/09/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004449|0001","requisition":"0000004449","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-09-24T00:00:00","reqnValue":456.9,"approvedValue":null,"originator":"*****","origName":"******","origEmail":"******@exidor.co.uk","line":1,"indx":4,"dateReqnRaisedL":"24/09/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004535|0002","requisition":"0000004535","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-10-24T00:00:00","reqnValue":270.39,"approvedValue":null,"originator":"*****","origName":"********","origEmail":"********@exidor.co.uk","line":2,"indx":5,"dateReqnRaisedL":"24/10/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004626|0001","requisition":"0000004626","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-11-26T00:00:00","reqnValue":34.59,"approvedValue":null,"originator":"***","origName":"********","origEmail":"*******@exidor.co.uk","line":1,"indx":6,"dateReqnRaisedL":"26/11/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004629|0001","requisition":"0000004629","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-11-26T00:00:00","reqnValue":34.44,"approvedValue":null,"originator":"****","origName":"*******","origEmail":"******@exidor.co.uk","line":1,"indx":7,"dateReqnRaisedL":"26/11/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"}]"}
This can be converted to XML by the controller, but not to the desired format. It seems it is being flattened to this and missing the child nodes
<?xml version="1.0"?>
<rows>[{"id":"GRP2-SYSPRO|SysproComapnyF|0000004013|0001","requisition":"0000004013","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-05-17T00:00:00","reqnValue":60,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":1,"dateReqnRaisedL":"17/05/18","reqStatus":"D","reqBackground":"card heading bg-secondary","reqStatusLabel":"Declined - put on hold","approvalBtn":"btn btn-success ","approvalBtnLbl":"UnApprove","declineBtnLbl":"UnDecline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004362|0001","requisition":"0000004362","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-08-29T00:00:00","reqnValue":1185,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":2,"dateReqnRaisedL":"29/08/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004427|0001","requisition":"0000004427","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-09-17T00:00:00","reqnValue":34.73,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":3,"dateReqnRaisedL":"17/09/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004550|0001","requisition":"0000004550","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-10-30T00:00:00","reqnValue":42.32,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":4,"dateReqnRaisedL":"30/10/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004645|0001","requisition":"0000004645","reqnStatus":"Awaiting Approval","dateReqnRaised":"2018-11-30T00:00:00","reqnValue":250.56,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":5,"dateReqnRaisedL":"30/11/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004652|0001","requisition":"0000004652","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-04T00:00:00","reqnValue":146.88,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":6,"dateReqnRaisedL":"04/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004653|0001","requisition":"0000004653","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-04T00:00:00","reqnValue":80.7,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":7,"dateReqnRaisedL":"04/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004659|0001","requisition":"0000004659","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-04T00:00:00","reqnValue":228.15,"approvedValue":null,"originator":"***","origName":"***","origEmail":"***@exidor.co.uk","line":1,"indx":8,"dateReqnRaisedL":"04/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"},{"id":"GRP2-SYSPRO|SysproComapnyF|0000004661|0002","requisition":"0000004661","reqnStatus":"Approved awiting Purchase Order","dateReqnRaised":"2018-12-05T00:00:00","reqnValue":528,"approvedValue":null,"originator":"*** ","origName":"***","origEmail":"***@exidor.co.uk","line":2,"indx":9,"dateReqnRaisedL":"05/12/18","reqStatus":"W","reqBackground":"card-heading bg-primary text-white","reqStatusLabel":"Awaiting Approval","approvalBtn":"btn btn-success ","approvalBtnLbl":"Approve","declineBtnLbl":"Decline","deleteBtnLbl":"Erase"}]</rows>
Can any one suggest a way to get this to the desire format of
<data>
<row>
<id>GRP2-SYSPRO|SysproComapnyF|0000004334|0003</id>
<requisition>0000004334</requisition>
<reqnStatus>Awaiting Approval</reqnStatus>
<dateReqnRaised>2018-08-15T00:00:00</dateReqnRaised>
etc
</row>
<row>
<id>GRP2-SYSPRO|SysproComapnyF|0000004340|0005</id>
<requisition>0000004340</requisition>
<reqnStatus>Awaiting Approval</reqnStatus>
<dateReqnRaised>2018-08-27T00:00:00</dateReqnRaised>
etc
</row>
</data>
The controller code is
// POST: api/ReqsTests
public async Task<IHttpActionResult> PostReqsTest(object json)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
//convert the Json object to xml
string xml = json.ToString();
XmlDocument doc = JsonConvert.DeserializeXmlNode(xml);
try
{
//SQL store procedure
SqlParameter param1 = new SqlParameter("@XmlIn", doc.InnerXml);
db.Database.ExecuteSqlCommand("exec [CHC_Web].[TestWebHandShake] @XmlIn",
param1);
}
catch (Exception e)
{
string message = e.Message;
return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message));
}
return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK,"Inserted to database"));
}
Thanks