首页 > 解决方案 > 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

解决方案


我在 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 的修复使得这个属性不会破坏经理。

感谢您的快速回复哈坎,你摇滚!


推荐阅读