[英]Converting a 2dimensional array in c# to Json string for javascript
因此,在調試javascript代碼並最終使其他所有功能正常工作時,我遇到了意外問題。 我從控制器獲得的數據已被拉平。
[HttpPost]
public JsonResult CalendarCellClasses(DateTime date)
{
DateTime firstOfMonth = date.AddDays(-(date.Day - 1));
DateTime lastOfMonth = firstOfMonth.AddMonths(1).AddDays(-1);
int additionalDaysBefore = firstOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : (int)firstOfMonth.DayOfWeek - 1;
int additionalDaysAfter = lastOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : 7 - (int)lastOfMonth.DayOfWeek;
int daysInMonth = lastOfMonth.Day;
int totalDays = additionalDaysBefore + additionalDaysAfter + daysInMonth;
int numWeeks = totalDays/7;
DateTime firstDayInSeries = firstOfMonth.AddDays(-additionalDaysBefore);
DateTime lastDayInSeries = lastOfMonth.AddDays(additionalDaysAfter);
DateTime current = firstDayInSeries;
string[,] dates = new string[numWeeks,7];
for (int week = 0; week < numWeeks; week++)
{
for (int day = 0; day < 7; day++)
{
dates[week, day] = TrafficData.GetTrafficDate(current).CSSClass;
current = current.AddDays(1);
}
}
return Json(dates);
}
如您所見,我有一個字符串[,],我想將其傳遞給調用此方法的javascript函數。
jQuery(document).ready(function() {
var calendar = $('#Trafikkalender');
var date = $('#selectedDate').val();
var param = { date: date }
var url = $('#calArrayPostUrl').data('url');
$.post(url, param, function(data) {
var body = calendar.find('tbody');
//var rows = body.getElementsByTagName('tr');
var rows = body.find('tr');
for (var i = 0; i < rows.length; i++) {
//var cols = rows[i].getElementsByTagName('td');
var cols = $(rows[i]).find('td');
for (var j = 0; j < cols.length; j++) {
var col = $(cols[j]);
col.addClass(data[i][j]);
}
}
});
});
但是根據調試器的數據,它是一個包含35個元素的數組,它們似乎是按一維數組排序的。 返回Json字符串時我做錯什么了嗎?還是2dim數組在javascript中不是問題?
json或多或少是一個文本文件。 我認為,您可以將數組編譯為json。
只需在開始處添加行,然后執行
while allarrayentries
{
enter new line into json;
}
然后添加最后幾行,以完成json。
使用類模型代替數組來傳遞數據。
public class Dates{
public DateTime current { get; set; }
public int number { get; set; }
}
在Javascript中,您可以像這樣訪問它:
for (var i = 0; i < rows.length; i++) {
var cols = $(rows[i]).find('td');
for (var j = 0; j < cols.length; j++) {
var col = $(cols[j]);
col.addClass(data[i]["current"]);
col.addClass(data[i]["number"]);
}
}
使用JSON.NET而不是內置的序列化程序進行序列化。 似乎內置的數組對這些數組的序列化很差(並且JSON.NET也更快)。
這是一個基本的實現:
public class JsonNetResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
throw new ArgumentNullException("context");
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("JSON GET is not allowed");
HttpResponseBase response = context.HttpContext.Response;
response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
if (this.ContentEncoding != null)
response.ContentEncoding = this.ContentEncoding;
if (this.Data == null)
return;
if (Data != null)
{
var writer = new JsonTextWriter(response.Output);
var serializer = JsonSerializer.Create(new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
DateFormatHandling = DateFormatHandling.IsoDateFormat
});
serializer.Serialize(writer, Data);
writer.Flush();
}
}
}
並重寫控制器的Json函數:
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
return new JsonNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding,
JsonRequestBehavior = behavior
};
}
protected override JsonResult Json(object data, string contentType, Encoding contentEncoding)
{
return new JsonNetResult
{
Data = data,
ContentType = contentType,
ContentEncoding = contentEncoding
};
}
了解更多: http : //www.newtonsoft.com/json
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.