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 VmCreateDynamicPage
{
    /// <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>
    /// 创建人
    /// </summary>
    [BindNever, JsonIgnore, XmlIgnore]
    public VmUserInfo? Creator { get; set; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这个代码文件定义了一个用于创建动态页面的视图模型类 VmCreateDynamicPage。让我详细解释一下这个类的结构和功能:

类的用途

这是一个用于创建自定义动态页面的视图模型(ViewModel),主要用于Web应用程序中处理动态页面的创建请求。

主要属性分析

1. HtmlContent(HTML内容)

[Required]
public HtmlContent? HtmlContent { get; set; }
  • 使用 [Required] 特性标记为必填字段
  • 存储页面的HTML内容

2. StyleContents(样式内容)

[XmlIgnore]
public SortedDictionary<int, StyleContent> StyleContents { get; set; } = [];
  • 使用 SortedDictionary 存储样式内容,键为整数(可能是优先级或序号)
  • [XmlIgnore] 表示在XML序列化时忽略此属性

3. SerializableStyleContents(可序列化的样式内容)

[XmlArray(ElementName = "StyleContents")]
[XmlArrayItem(ElementName = "StyleContent")]
[JsonIgnore]
public KeyValueElement[] SerializableStyleContents =>
    StyleContents.Select(x => new KeyValueElement(x.Key, x.Value)).ToArray();
  • 这是一个只读属性,将 StyleContents 转换为可XML序列化的格式
  • [JsonIgnore] 表示在JSON序列化时忽略
  • 用于XML序列化支持

4. ScriptContents(脚本内容)

[XmlIgnore]
public SortedDictionary<int, ScriptContent> ScriptContents { get; set; } = [];
  • 与样式内容类似,存储JavaScript脚本内容
  • 同样使用排序字典来维护执行顺序

5. SerializableScriptContents(可序列化的脚本内容)

[XmlArray(ElementName = "ScriptContents")]
[XmlArrayItem(ElementName = "ScriptContent")]
[JsonIgnore]
public KeyValueElement[] SerializableScriptContents =>
    ScriptContents.Select(x => new KeyValueElement(x.Key, x.Value)).ToArray();
  • 脚本内容的XML序列化版本

6. Creator(创建人)

[BindNever, JsonIgnore, XmlIgnore]
public VmUserInfo? Creator { get; set; }
  • 存储页面创建者信息
  • [BindNever] 防止模型绑定时自动赋值
  • 同时忽略JSON和XML序列化

设计特点

  1. 序列化支持:同时支持JSON和XML序列化,通过不同的属性来处理
  2. 数据验证:使用 DataAnnotations 进行输入验证
  3. 安全性:创建者信息不参与序列化和模型绑定,防止客户端篡改
  4. 有序存储:使用 SortedDictionary 确保样式和脚本按顺序执行
  5. 灵活性:支持多个样式和脚本内容,可以组合构建复杂页面

这个类很好地体现了Web开发中视图模型的设计模式,既满足了业务需求,又考虑了安全性和可维护性。

评论加载中...