。NET Core 3.1-Ajax OnGet和使用NEW System.Text.Json返回对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了。NET Core 3.1-Ajax OnGet和使用NEW System.Text.Json返回对象相关的知识,希望对你有一定的参考价值。
今天,当我第一次尝试从包含外键字段的LINQ查询中返回对象数组时,我偶然发现了这个问题。 Microsoft离开适用于.NET Core 3+的Newtonsoft JSON库的举动使我不知道如何执行以下所示的等效方法:
下面的示例曾经在Core 2.2中工作,但是现在抛出错误'System.Text.Json.JsonException:检测到可能的对象周期,不支持。这可能是由于循环造成的,也可能是由于对象深度大于最大允许深度32造成的。'
public async Task<IActionResult> OnGetSelectAllReportTemplatesAsync()
{
// Get the currently logged in user.
var currentlyLoggedInUser = await _userManager.GetUserAsync(User);
// Note - ApplicationUserId is a foreign key field in the DB Table...
var reportTemplates = _context.ReportTemplate
.Where(s => s.Private == true & s.ApplicationUserId == currentlyLoggedInUser.Id)
.OrderBy(s => s.Name).ToListAsync();
return new JsonResult(reportTemplates);
}
下面的Ajax电话:
$.ajax({
type: "GET",
url: "/Reports/ListView?handler=SelectAllReportTemplates",
contentType: "json",
dataType: "json",
success: function (data) {
data.forEach(function (element) {
$("#editReportTemplateSelect").append('<option value="' + element.id + '">' + element.name + '</option>');
reportTemplatesArray.push({ id: '' + element.id + '', name: '' + element.name + '', description: '' + element.description + '', timePeriod: '' + element.timePeriod + '', startDate: '' + element.startDate + '', startTimeHours: '' + element.startTimeHours + '', startTimeMinutes: '' + element.startTimeMinutes + '', endDate: '' + element.endDate + '', endTimeHours: '' + element.endTimeHours + '', endTimeMinutes: '' + element.endTimeMinutes + '', logLevel: '' + element.logLevel + '', eventCategory: '' + element.eventCategory + '', eventType: '' + element.eventType + '', eventSource: '' + element.eventSource + '', userAccount: '' + element.userAccount + '', private: '' + element.private + '', });
});
$("#reportTemplateNameInput").val(''); // Clear the department name input field.
$('#reportTemplateDescriptionTextarea').val(''); // Clear the department description textarea.
},
error: function () {
$("#editreportTemplateSelectMessageBar").html("Error while making Ajax call!");
setTimeout(function () { $("#editreportTemplateSelectMessageBar").html(''); }, 5000);
}
});
我尝试用属性'[JsonIgnore]'在模型类中标记外键字段,因为我实际上不需要从其他表中读取嵌套属性,我所需要的只是ApplicationUserId字符串值本身。我具有使用关系的表的唯一原因是进行级联删除。
我找不到解释如何使用较新系统的代码示例?
[好,所以在将以前的JSON功能(Microsoft.AspNetCore.Mvc.NewtonsoftJson修补程序)安装为NuGet之后,我的连线在这里有点交叉,我仍然遇到对象循环错误。
我的解决方案是在模型类中使用属性[JsonIgnore]设置外键字段,然后我如下更新了OnGet方法。现在,该方法使用了一个更简化的LINQ查询,该查询没有错误地通过,然后我从选择的后记之后手动进行筛选,创建了一个列表,然后可以将其返回给Ajax GET函数。
模型类别:
public class ReportTemplate
{
public int Id { get; set; } // Primary Key
other parameter object here...
[Required]
[JsonIgnore]
public string ApplicationUserId { get; set; }
[JsonIgnore]
public ApplicationUser ApplicationUser { get; set; }
}
剃刀页面型号:
public async Task<IActionResult> OnGetSelectAllReportTemplates()
{
// Get the currently logged in user.
var currentlyLoggedInUser = await _userManager.GetUserAsync(User);
// Create a List
List<ReportTemplate> reportTemplates = new List<ReportTemplate>();
// Run a simple get all LINQ query
var reports = _context.ReportTemplate.OrderBy(s => s.Name);
// Do the filtering, manually from the query collection
foreach (var report in reports)
{
if (report.Private == false)
{
reportTemplates.Add(report);
}
if (report.Private == true & report.ApplicationUserId == currentlyLoggedInUser.Id)
{
reportTemplates.Add(report);
}
}
return new JsonResult(reportTemplates);
}
以上是关于。NET Core 3.1-Ajax OnGet和使用NEW System.Text.Json返回对象的主要内容,如果未能解决你的问题,请参考以下文章
从对象中的集合中删除对象时,.net core 2.1 razor 页面视图无法正确更新
在 Backbone Stickit 中结合使用 visible 和 onGet