
1 using DMS.Common.BaseResult;
2 using Microsoft.AspNetCore.Mvc.ModelBinding;
3 using System;
4 using System.Collections.Generic;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8
9 /// <summary>
10 /// 聚合扩展方法类
11 /// </summary>
12 public static class ModelStateExts
13 {
14 #region [ 得到模型错误消息 NonAction Task<string> ModelStateMsg(ModelStateDictionary modelState, List<string> PartValidKeys = null) ]
15
16 /// <summary>
17 /// 得到模型错误消息
18 /// <code>
19 /// <![CDATA[
20 /// if (ModelState.IsValidOK(out string errmsg))
21 /// {
22 /// return await Service.GetLiveVodAndVideoProductList(CurrentUserTicket.ID.ToLong(), param);
23 /// }
24 /// else
25 /// {
26 /// return new ResponsePageResult<ProductVodOrVideoResult> { errno = 1, errmsg = errmsg };
27 /// }
28 /// ]]>
29 /// </code>
30 /// </summary>
31 /// <param name="modelState"></param>
32 /// <param name="errmsg">返回的错误消息</param>
33 /// <param name="PartValidKeys">要验证的属性集合</param>
34 /// <returns></returns>
35 public static bool IsValidOK(this ModelStateDictionary modelState, out string errmsg, List<string> PartValidKeys = null)
36 #region [ MyRegion ]
37 {
38 var errorCount = 0;
39
40 List<string> sb = new List<string>();
41 //获取所有错误的Key
42 List<string> keys = PartValidKeys ?? modelState.Keys.ToList();
43
44 //获取每一个key对应的ModelStateDictionary
45 foreach (var key in keys)
46 {
47 var errors = modelState[key].Errors.ToList();
48 errorCount += errors.Count;
49
50 //将错误描述添加到sb中
51 foreach (var error in errors)
52 {
53 sb.Add(error.ErrorMessage);
54 }
55 }
56
57 var result = string.Join(",", sb);
58 if (string.IsNullOrWhiteSpace(result))
59 {
60 result = $"{result}。";
61 }
62
63 errmsg = result;
64
65 return errorCount > 0 ? false : true;
66 }
67 #endregion
68
69 #endregion
70
71 #region [ 进行模型验证,并返回服务结果 ]
72
73 /// <summary>
74 /// 执行模型验证,并返回指定服务方法的执行结果
75 /// 调用方式:return await ModelState.GetResult(Service.ActionName, param);
76 /// </summary>
77 /// <typeparam name="TParam"></typeparam>
78 /// <typeparam name="TResult"></typeparam>
79 /// <param name="modelState"></param>
80 /// <param name="func"></param>
81 /// <param name="param"></param>
82 /// <param name="PartValidKeys"></param>
83 /// <returns></returns>
84 public async static Task<TResult> Execute<TParam, TResult>(this ModelStateDictionary modelState, Func<TParam, Task<TResult>> func, TParam param, List<string> PartValidKeys = null) where TResult : class, new()
85 #region [ MyRegion ]
86 {
87 if (IsValidOK(modelState, out string errmsg, PartValidKeys: PartValidKeys))
88 {
89 var result = new TResult { };
90
91 return await func.Invoke(param);
92 }
93 else
94 {
95 return new DataResultBase { errno = 600, errmsg = errmsg } as TResult;
96 }
97 }
98 #endregion
99
100 #endregion
101 }

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2017-12-05 .Net IOC框架入门之一 Unity
2017-12-05 .Net IOC框架入门之二 CastleWindsor
2017-12-05 ABP Zero示例项目问题总结
2017-12-05 ABP Zero 本地化语言的初始化和扩展
2017-12-05 ABP Zero 导航菜单之角色权限
2017-12-05 ABP架构学习系列三:手工搭建ABP框架
2017-12-05 ABP架构学习系列二:ABP中配置的注册和初始化