Ich habe das folgende Objekt, das ich in einer MVC-Controller bin vorbei:Javascript Windows.Location passieren komplexe JSON-Objekt
this.JsonData = {
"__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val(),
"searchMode": {
"mode": Number(mode.val()),
"pageSize": Number(pagesize.val()) || 5, "pageNumber": Number(pagenumber.val()) || 1,
"sortField": sortfield.val() || "Ref",
"sortDirection": sortdirection.val() || "desc"
},
"searchData": {
"Compare": Number(StdComparison.val()),
"SearchTextFrom": searchText.val(),
"SearchTextTo": searchTextTo.val()
}
Dies funktioniert ok, aber ich letzte Forderung entstanden ist, wobei ich suche diese kodieren Objekt zur Verwendung mit der JavaScript-Funktion window.location
Vorschläge habe ich verwendet:
how-to-pass-complex-json-object-in-url-using-javascript
window.location + "?SearchCriteria=" + JSON.Stringify(this.JsonData);
Erzeugt folgende Anfrage:
Controller/Action?SearchCriteria={
"__RequestVerificationToken": "tokenvalue",
"searchMode": {
"mode": 2,
"pageSize": 5,
"pageNumber": 1,
"sortField": "Ref",
"sortDirection": "desc"
},
"searchData": {
"Compare": 1,
"SearchTextFrom": "From A",
"SearchTextTo": "To Z"
}
}
Während
window.location + "?SearchCriteria=" + this.JsonData;
Produziert folgendes:
Controller/Action?SearchCriteria=[object%20Object]
Mit einer Seite nicht Fehler auf beiden oben gefunden.
UPDATE:
Ich habe auf der Suche nach einer Antwort vorwärts bewegt.
OK wie auf Anfrage von Helfern, habe ich mehr Quellcode enthalten.
Ich habe drei Klassen.
public class MainSearch
{
public MainSearch()
{
SearchData searchData = new SearchData();
SearchMode searchMode = new SearchMode();
}
public SearchData searchData { get; set; }
public SearchMode searchMode { get; set; }
public int? page { get; set; }
public object ToPagedListParameters(int pagenumber)
{
searchMode.pageNumber = pagenumber;
return page;
}
public IList<string> ValidationErrorMessages { get; set; }
}
public class SearchData
{
// Fields used for the ticket number search
public int? ticketNumberCompare { get; set; }
public string ticketSearchTextFrom { get; set; }
public string ticketSearchTextTo { get; set; }
}
public class SearchMode
{
public int? mode { get; set; }
public int? pageNumber { get; set; }
public int? pageSize { get; set; }
public string sortDirection { get; set; }
public string sortField { get; set; }
public string userURN { get; set; }
public string __RequestVerificationToken { get; set; }
}
Diese Klassen halten die verwendeten Kriterien für die Suche (search abgeschnitten wurde)
Das folgende ist mein Controller-Code:
[HttpGet]
public ActionResult DownloadFileCSV(MainSearch search)
{
string fileName = Server.MapPath("~/Content/Pdf/") + "somefile.pdf";
byte[] fileContents = System.IO.File.ReadAllBytes(fileName);
return File(fileContents, "application/pdf", "result.pdf");
}
Und schließlich die Ajax-Aufruf, der gemacht wird aus der cshtml-Datei.
$("#DownloadAttachmentCSV").click(function() {
$.ajax(
{
url: '@Url.Action("DownloadFileCSV", "Home")',
contentType: 'application/json; charset=utf-8',
datatype: 'json',
data: JsonData,
type: "GET",
success: function() {
window.location = '@Url.Action("DownloadFileCSV", "Home")' + '?' + JsonData;
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});
Merkwürdigerweise wird der Code oben tatsächlich funktionieren und die Datei heruntergeladen ist, aber hier ist das Problem. Die JSON-Daten füllen nicht die MainSearch-Variable.
Der einzige Weg, wie ich die JSON-Daten zum Füllen der C# -Klassen erhalten kann, besteht darin, die Methode in einen POST zu ändern.
Muss dies der Fall sein?
Sie können ein komplexes Javascript-Objekt an eine GET-Methode übergeben.Was ist die Signatur der Methode, die Sie aufrufen? –
Sie verwendet HttpGet auf der MVC-Controller-Aktion – gilesrpa
Ja, ich weiß - wieder, was ist die Signatur der Methode (und wenn es ein Modell ist, zeigen Sie dieses Modell) –