piranha-cms - Piranha CMS 中的反序列化媒体字段失败
问题描述
为“无头”场景修改 Piranha:我将 api 分离成它自己的 REST API,并将 MVC 分离成它自己的调用 REST API 的 UI。大多数情况下它运作良好,但现在是一个障碍。我的 REST API 将 Piranha api 的结果序列化,而我的 MVC Web 将其反序列化为 Piranha StandardPage类型。这适用于除Media之外的所有字段,Media始终为空。使用 newtonsoft.Json。
Media属性在 Piranha.Extend.Fields.MediaFieldBase 中使用内部 set 定义,这解释了为什么我不能反序列化到它。所以我在 Media 属性中添加了一个[JsonProperty]属性。一旦我这样做了,媒体字段就会被 MVC 正确反序列化,并出现图像。
但是后来我发现这破坏了其他东西:在管理器中,当我尝试保存带有英雄图像的页面时,保存按钮会旋转,好像成功了一样停止,但是吐司从来没有显示成功。我为 Microsoft.AspNetCore.Mvc.Infrastructure 设置了调试日志记录,并看到发生这种情况时出现模型状态错误:
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
Executed controller factory for controller Piranha.JA.Manager.Controllers.PageApiController (Piranha.JA.Manager)
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilter[1]
The request has model state errors, returning an error response.
dbug: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[3]
Request was short circuited at action filter 'Microsoft.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilter'.
对于大多数操作,我可以调试到 PageApiController,但是当Save执行时,没有一个断点被命中。
我还尝试从集合中删除内部访问器(并删除 [JsonProperty])并得到相同的行为:可以反序列化媒体,但尝试使用管理器中的英雄保存页面会导致模型状态错误。
如果我们能解决这个问题,我很想写一些关于如何去无头的文档。
我们已经调试了几天了,有人可以帮忙吗?
解决方案
我在 Piranha CMS github 上发布了这篇文章,其中一位作者 Hakan Edling 在几个小时内就回答了:
“根本问题是,当在媒体选择器的管理器中选择新项目时,分配的媒体模型包含格式化的字符串大小“xxx kb”。当 ASP.NET 尝试将其反序列化为 long 时,它会失败。因此,为基于媒体的字段更改 .vue 组件中的以下行:
this.model.media = media;
至
this.model.media = {
id: media.id,
folderId: media.folderId,
type: media.type,
filename: media.filename,
contentType: media.contentType,
publicUrl: media.publicUrl,
};
解决了 Media 属性公开时管理器中的序列化错误。我会将此修复推送到新分支,以便您对其进行测试。”
不久之后,“请用分支测试https://github.com/PiranhaCMS/piranha.core/tree/features/make-mediafield-media-public ”
我仍然必须将 [JsonProperty] 属性添加到 MediaFieldBase 类中的 Media 字段,以便我的反序列化器可以访问内部 set 方法。Hakan 的修复使得这个属性不会破坏经理。
感谢您的快速回复哈坎,你摇滚!
推荐阅读
- asp.net - ASP.NET Core 运行时 3.1.9
- c# - C# 在控制台应用程序上异步并行下载多个文件时遇到问题
- node.js - Node.js - node-rsa - 加密期间出错。原始错误:错误:错误:0306E06C:bignumroutines:BN_mod_inverse:no inverse
- vue.js - 通天塔 - VueJS | 模块构建失败:错误:插件/预设文件不允许导出对象,只能导出函数。在
- java - 在Java和python实现中将数组转换为字符串
- kotlin - 以通用方式向函数添加副作用
- java - 如何在 Eclipse 中将文件夹标记为测试文件夹?
- spring-kafka - 如何在spring boot webservice中的API调用后从启动开始寻求kafka记录
- perl - DateTime -> set_time_zone(...) 使用世界时区字符串,用于丢失的城镇
- ffmpeg - 有没有办法让多个视频源循环与 ffmpeg 一起旋转?