using System.ComponentModel.DataAnnotations;
using Dpz.Core.Public.ViewModel.DynamicPages;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace Dpz.Core.Web.Controllers;
[CheckAuthorize]
public class DynamicController(
IDynamicPageService dynamicPageService,
IHttpCurrentUserService currentUserService
) : Controller
{
[HttpGet]
public async Task<IActionResult> MyDynamicPages(
int pageIndex = 1,
int pageSize = 10,
string name = ""
)
{
var source = await dynamicPageService.GetPageAsync(
pageIndex,
pageSize,
name,
User.RequiredNameIdentifier
);
var data = Pagination<VmDynamicPage>.Create(source);
return Json(new ResultInfo(data));
}
/// <summary>
/// 创建动态页
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> Create([FromBody] [Required] VmCreateDynamicPage model)
{
if (!ModelState.IsValid)
{
var errors = ModelState
.Select(x => x.Value?.Errors ?? new ModelErrorCollection())
.SelectMany(x => x)
.Select(x => x.ErrorMessage)
.ToArray();
return Json(new ResultInfo(string.Join("\n", errors)));
}
model.Creator = await currentUserService.GetRequiredUserInfoAsync();
await dynamicPageService.CreateAsync(model);
return Json(new ResultInfo(true));
}
public async Task<IActionResult> Find(string id = "")
{
var userInfo = await currentUserService.GetRequiredUserInfoAsync();
var pageInformation = await dynamicPageService.FindAsync(id, userInfo.Id);
return Json(new ResultInfo(pageInformation));
}
public async Task<IActionResult> Save([FromBody] [Required] VmEditDynamicPage model)
{
if (!ModelState.IsValid)
{
var errors = ModelState
.Select(x => x.Value?.Errors ?? new ModelErrorCollection())
.SelectMany(x => x)
.Select(x => x.ErrorMessage)
.ToArray();
return Json(new ResultInfo(string.Join("\n", errors)));
}
model.CreatorId = User.RequiredNameIdentifier;
await dynamicPageService.EditContentAsync(model);
return Json(new ResultInfo(true));
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码解释
这是一个 ASP.NET Core MVC 控制器,用于管理动态页面(Dynamic Pages)的 CRUD 操作。
整体结构
控制器定义
[CheckAuthorize]
public class DynamicController : Controller
- 使用
[CheckAuthorize]特性进行授权检查,确保只有授权用户才能访问 - 通过主构造函数(C# 12 特性)注入两个依赖服务:
IDynamicPageService:动态页面业务逻辑服务IHttpCurrentUserService:当前用户信息服务
方法详解
1. MyDynamicPages(获取分页列表)
[HttpGet]
public async Task<IActionResult> MyDynamicPages(int pageIndex = 1, int pageSize = 10, string name = "")
功能:获取当前用户的动态页面列表(支持分页和名称搜索)
参数:
pageIndex:页码(默认第1页)pageSize:每页数量(默认10条)name:搜索关键字(可选)
流程:
- 调用服务层获取分页数据
- 使用
User.RequiredNameIdentifier获取当前用户ID - 将结果封装成
Pagination<VmDynamicPage>对象 - 返回 JSON 格式的成功结果
2. Create(创建动态页)
[HttpPost]
public async Task<IActionResult> Create([FromBody] [Required] VmCreateDynamicPage model)
功能:创建新的动态页面
验证机制:
if (!ModelState.IsValid) {
// 提取所有验证错误信息
var errors = ModelState
.Select(x => x.Value?.Errors ?? new ModelErrorCollection())
.SelectMany(x => x)
.Select(x => x.ErrorMessage)
.ToArray();
return Json(new ResultInfo(string.Join("\n", errors)));
}
- 检查模型验证状态
- 如果验证失败,收集所有错误消息并用换行符连接
- 返回包含错误信息的 JSON 响应
核心逻辑:
- 获取当前用户信息并设置为创建者
- 调用服务层创建动态页
- 返回成功结果
3. Find(查找单个动态页)
public async Task<IActionResult> Find(string id = "")
功能:根据 ID 查找特定动态页面
流程:
- 获取当前用户信息
- 调用服务层查找页面(传入页面ID和用户ID,可能用于权限验证)
- 返回页面详细信息
4. Save(保存编辑)
public async Task<IActionResult> Save([FromBody] [Required] VmEditDynamicPage model)
功能:保存对动态页面的编辑
特点:
- 与 Create 方法类似的验证逻辑
- 使用
User.RequiredNameIdentifier设置创建者ID(确保权限控制) - 调用
EditContentAsync更新内容 - 返回操作结果
技术特点
- 异步编程:所有方法都使用
async/await模式 - 模型验证:使用
[Required]和ModelState进行数据验证 - 依赖注入:使用主构造函数注入服务
- 统一响应格式:所有接口都返回
ResultInfo包装的 JSON 数据 - 权限控制:通过
[CheckAuthorize]和用户标识符确保数据安全
潜在改进点
- Create 和 Save 方法中的验证逻辑重复,可以提取为私有方法或过滤器
- Find 方法缺少
[HttpGet]特性标注(虽然默认为 GET) - 可以添加更详细的 XML 注释文档
AI 正在分析代码…
评论加载中...