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 }