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]:在序列化时忽略此属性- 通常在后端代码中根据当前登录用户设置
设计特点
序列化兼容性:同时支持JSON和XML序列化,通过不同的属性来处理序列化需求
有序存储:使用
SortedDictionary确保样式和脚本内容按照指定顺序排列数据验证:使用数据注解进行输入验证
安全性考虑:Creator属性使用
[BindNever]防止恶意用户通过表单提交修改创建人信息
这个类体现了在处理复杂数据结构时,如何平衡功能需求、序列化需求和安全性考虑的良好设计实践。
评论加载中...