首页 > 解决方案 > 无法将“AttachmentDetailsDto”类型的对象转换为“System.String”类型

问题描述

有方法

public async Task<IEnumerable<IGrouping<string, AttachmentDetailsDto>>> GetAttachmentsAsync(long assetInfoId)

在里面我做...

var results = new List<AttachmentDetailsDto>();
var attachmentEntities = await _attachmentRepository.GetAsync(x => x.ParentAssetInfoId == assetInfoId && !x.IsDeleted).ConfigureAwait(false);

foreach (var attachmentEntity in attachmentEntities)
{
    var attachmentTypeEntity = await _attachmentTypeRepository.GetByIdAsync(attachmentEntity.MetattachTypeId).ConfigureAwait(false);

    var metattachDetail = new AttachmentDetailsDto
    {
        Id = attachmentEntity.Id,
        TypeId = attachmentEntity.MetattachTypeId,
        Type = attachmentTypeEntity.Name,
        Name = attachmentEntity.Name,
        Notes = attachmentEntity.Notes,
    };

    attachmentType = attachmentEntity.MetaType;
    var assetInfoEntity = default(AssetInfo);

    switch (attachmentType)
    {
        case "DigiDoc":
            var digiDocEntity = await _digiDocRepository.GetByIdAsync(attachmentEntity.TypeId).ConfigureAwait(false);
            metattachDetail.DigiDoc = new DigiDocDto
            {
                Id = digiDocEntity.Id,
                ContentType = digiDocEntity.ContentType,
                Url = digiDocEntity.Url
            };
            break;
... other cases ...
    }
    results.Add(metattachDetail);
}

return results.GroupBy(x => x.Type);

这里没有错误,但在我的控制器中......

        public async Task<ActionResult> GetAttachmentsAsync(long assetInfoId)
        {
            var result = await _attachmentManager.GetAttachmentsAsync(assetInfoId).ConfigureAwait(false);
            return Ok(result);
        }

return Ok(result);“ ”行抛出错误

...我不明白,.Net Framework 中的相同代码完美运行,现在在 .Net Core 3.1 中出现错误...

错误:

无法将“AttachmentDetailsDto”类型的对象转换为“System.String”类型。

堆栈跟踪:

在 System.Text.Json.JsonPropertyInfoNotNullable'4.OnWriteEnumerable(WriteStackFrame& current, Utf8JsonWriter writer) 在 System.Text.Json.JsonPropertyInfo.WriteEnumerable(WriteStack& state, Utf8JsonWriter writer) 在 System.Text.Json.JsonSerializer.HandleEnumerable(JsonClassInfo elementClassInfo, JsonSerializerOptions options, Utf8JsonWriter writer, WriteStack& state) at System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer, Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions options, WriteStack& state) at System.Text.Json.JsonSerializer.d__50.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft。AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.d__5.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.d__5.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo。 Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<g__Logged|21_0>d.MoveNext () 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft.AspNetCore.Mvc.Infrastructure .ResourceInvoker。<g__Awaited|29_0>d`2.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker .ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime .CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<g__Awaited|24_0>d.MoveNext() 在 System.Runtime。 ExceptionServices.ExceptionDispatchInfo。Throw() at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc .Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Microsoft .AspNetCore.Mvc.Infrastructure.ResourceInvoker.<g__Logged|17_1>d.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime。编译器服务。TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Routing.EndpointMiddleware.<g__AwaitRequestTask|6_0>d.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.d__5.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter .ThrowForNonSuccess(任务任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo。Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.d__5.MoveNext() 在 System.Runtime。 ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.d__4.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 HomeaZZon.Api.Middlewares.ExceptionMiddleware.d__3。MoveNext() 在 C:\repo\homeazzon\api\api-.core-monolothic\HomeaZZon.Api\Middlewares\ExceptionMiddleware.cs:line 28

...

启动.cs

...

            services.AddMvc().AddJsonOptions(o =>
            {
                o.JsonSerializerOptions.IgnoreNullValues = true;
                o.JsonSerializerOptions.PropertyNamingPolicy = null;
            });

标签: c#asp.net-core

解决方案


正如其他人所提到的,很难真正确定您的错误,但如果您只是想要在序列化方面与 .NET Framework 中的功能相同,那么您就是这样做的。

安装以下 nuget 包:

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

然后在您的服务方法中,您将拥有类似“AddMVC”的内容。像这样修改:

services.AddMvc().AddNewtonsoftJson();

更多信息:https ://dotnetcoretutorials.com/2019/12/19/using-newtonsoft-json-in-net-core-3-projects/

.NET Core 项目 3+ 使用新的 JSON 序列化程序,老实说还不错,但到处都有一些问题。更高版本中的性能优势是一个很大的好处,但如果您只需要与之前完全一样的东西,那么您需要使用 JSON.NET(使用上述说明),您将回到过去!


推荐阅读