using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;
using System.Xml.Serialization;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace Dpz.Core.Public.ViewModel.DynamicPages;

/// <summary>
/// 修改自定义页 入参
/// </summary>
public class VmEditDynamicPage
{
    /// <summary>
    /// HTML 内容
    /// </summary>
    [Required]
    public HtmlContent? HtmlContent { get; set; }

    /// <summary>
    /// 样式 内容
    /// </summary>
    [XmlIgnore]
    public SortedDictionary<int, StyleContent> StyleContents { get; set; } = [];

    /// <summary>
    /// Gets or sets SerializableStyleContents.
    /// </summary>
    [XmlArray(ElementName = "StyleContents")]
    [XmlArrayItem(ElementName = "StyleContent")]
    [JsonIgnore]
    public KeyValueElement[] SerializableStyleContents =>
        StyleContents.Select(x => new KeyValueElement(x.Key, x.Value)).ToArray();

    /// <summary>
    /// 脚本 内容
    /// </summary>
    [XmlIgnore]
    public SortedDictionary<int, ScriptContent> ScriptContents { get; set; } = [];

    /// <summary>
    /// Gets or sets SerializableScriptContents.
    /// </summary>
    [XmlArray(ElementName = "ScriptContents")]
    [XmlArrayItem(ElementName = "ScriptContent")]
    [JsonIgnore]
    public KeyValueElement[] SerializableScriptContents =>
        ScriptContents.Select(x => new KeyValueElement(x.Key, x.Value)).ToArray();

    /// <summary>
    /// 创建人ID
    /// </summary>
    [BindNever, JsonIgnore]
    public string? CreatorId { get; set; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个用于处理动态页面编辑功能的视图模型(ViewModel)类。让我详细解释一下这个代码:

类的用途

VmEditDynamicPage 是一个用于修改自定义页面的数据传输对象,主要用于接收前端传来的页面编辑数据。

主要属性分析

1. HTML内容

[Required]
public HtmlContent? HtmlContent { get; set; }
  • 存储页面的HTML内容
  • 使用 [Required] 特性进行必填验证

2. 样式内容处理

[XmlIgnore]
public SortedDictionary<int, StyleContent> StyleContents { get; set; } = [];

[XmlArray(ElementName = "StyleContents")]
[XmlArrayItem(ElementName = "StyleContent")]
[JsonIgnore]
public KeyValueElement[] SerializableStyleContents =>
    StyleContents.Select(x => new KeyValueElement(x.Key, x.Value)).ToArray();

这里使用了一个巧妙的设计模式:

  • StyleContents:实际的业务属性,使用 SortedDictionary 存储样式内容,按序号排序
  • SerializableStyleContents:用于XML序列化的辅助属性
  • [XmlIgnore][JsonIgnore] 确保在不同序列化场景下使用正确的属性

3. 脚本内容处理

[XmlIgnore]
public SortedDictionary<int, ScriptContent> ScriptContents { get; set; } = [];

[XmlArray(ElementName = "ScriptContents")]
[XmlArrayItem(ElementName = "ScriptContent")]
[JsonIgnore]
public KeyValueElement[] SerializableScriptContents =>
    ScriptContents.Select(x => new KeyValueElement(x.Key, x.Value)).ToArray();
  • 与样式内容采用相同的设计模式
  • 用于处理页面的JavaScript脚本内容

4. 创建人ID

[BindNever, JsonIgnore]
public string? CreatorId { get; set; }
  • [BindNever]:防止模型绑定时从请求中绑定此属性
  • [JsonIgnore]:JSON序列化时忽略此属性
  • 通常在服务器端设置,不允许客户端修改

设计特点

  1. 多重序列化支持:同时支持JSON和XML序列化
  2. 数据验证:使用DataAnnotations进行输入验证
  3. 安全性:通过 [BindNever] 保护敏感字段
  4. 有序存储:使用 SortedDictionary 确保内容按顺序处理
  5. 序列化转换:通过辅助属性处理复杂类型的序列化问题

这个类很好地展现了在ASP.NET Core中处理复杂数据模型的最佳实践。

评论加载中...