using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
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; } = [];

    [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; } = [];

    [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分析的结果,请根据实际情况进行判断。

这是一个用于创建动态页面的视图模型类,主要用于在ASP.NET Core应用中处理自定义页面的创建。让我详细解释一下这个代码:

类的整体功能

VmCreateDynamicPage 是一个视图模型类,用于封装创建动态页面所需的数据,包括HTML内容、样式内容、脚本内容等。

主要属性解析

1. HtmlContent 属性

[Required]
public HtmlContent? HtmlContent { get; set; }
  • 存储页面的HTML内容
  • 使用[Required]特性标记为必填字段
  • 可空类型,但由于有Required验证,实际使用时不能为null

2. StyleContents 属性组

[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]分别控制在XML和JSON序列化时忽略对应属性
  • 这样设计是因为SortedDictionary不能直接进行XML序列化

3. ScriptContents 属性组

[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();
  • 与StyleContents采用相同的设计模式
  • 用于存储页面的JavaScript脚本内容

4. Creator 属性

[BindNever, JsonIgnore, XmlIgnore]
public VmUserInfo? Creator { get; set; }
  • 存储创建人信息
  • [BindNever]:防止模型绑定时自动赋值
  • [JsonIgnore, XmlIgnore]:在序列化时忽略此属性
  • 通常在后端代码中根据当前登录用户设置

设计特点

  1. 序列化兼容性:同时支持JSON和XML序列化,通过不同的属性来处理序列化需求

  2. 有序存储:使用SortedDictionary确保样式和脚本内容按照指定顺序排列

  3. 数据验证:使用数据注解进行输入验证

  4. 安全性考虑:Creator属性使用[BindNever]防止恶意用户通过表单提交修改创建人信息

这个类体现了在处理复杂数据结构时,如何平衡功能需求、序列化需求和安全性考虑的良好设计实践。

评论加载中...