C#MVC框架中的model验证,在其他架构中使用(Winform或控制台)


  在.NET MVC中,当页面提交model到Action的时候,自动填充ModelState。使用ModelState.IsValid进行方便快捷的数据验证,其验证也是调用命名空间System.ComponentModel.DataAnnotations和System.ComponentModel中的各种方法进行验证。
 但是,使用非MVC架构时,就需要写很多if判断或者正则表达式,当有多个字段需要验证的时候就需要写很多if判断,即繁琐,又不美观。这里记录一个方法,使用System.ComponentModel.DataAnnotations和System.ComponentModel来实现自己的验证model抛出相应的错误信息。

1、首先编写要验证的类(UserInfo),并添加特性(Attribute);注意引用System.ComponentModel和System.ComponentModel.DataAnnotations;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Model
{
    //DisplayName           显示名
    //Required              必填项
    //StringLength          字符串长度
    //Range                 数学范围(小数点)
    //RegularExperssion     正则表达式验证--在线正则表达式
    //Compare               两次比较

    /// <summary>
    /// 需要验证的数据模型,添加特性
    /// </summary>
    public class UserInfo
    {
        [DisplayName("姓名")]
        [Required(ErrorMessage = "必须填写")]
        public string Name { get; set; }

        [DisplayName("邮件")]
        [Required(ErrorMessage = "必须填写")]
        [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "格式不正确")]
        public string Email { get; set; }

        [DisplayName("年龄")]
        [Required(ErrorMessage = "必须填写")]
        [Range(1, 100, ErrorMessage = "超出范围")]
        public int Age { get; set; }

        [DisplayName("电话")]
        [Required(ErrorMessage = "必须填写")]
        [StringLength(11, MinimumLength = 11, ErrorMessage = "输入长度不正确")]
        public string Phone { get; set; }
    }
}

2、编写验证帮助静态类,主要用到的是Validator.TryValidateObject方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace Validatetion
{
    /// <summary>
    /// 自动验证帮助类
    /// </summary>
    public class ValidatetionHelper
    {
        /// <summary>
        /// 自动验证
        /// </summary>
        /// <param name="value">要验证的类型名称</param>
        /// <returns>错误结果</returns>
        public static ValidResult IsValid(object value)
        {
            ValidResult result = new ValidResult();
            try
            {
                var validationContext = new ValidationContext(value);
                var results = new List<ValidationResult>();
                var isValid = Validator.TryValidateObject(value, validationContext, results, true);

                if (!isValid)
                {
                    result.IsVaild = false;
                    result.ErrorMembers = new List<ErrorMember>();
                    foreach (var item in results)
                    {
                        result.ErrorMembers.Add(new ErrorMember()
                        {
                            ErrorMessage = GetDisplayName(value, item.MemberNames.FirstOrDefault()) + " " + item.ErrorMessage,
                            ErrorMemberName = item.MemberNames.FirstOrDefault()
                            //ErrorMemberName = GetDisplayName(value, item.MemberNames.FirstOrDefault())
                        });
                    }
                }
                else
                {
                    result.IsVaild = true;
                }
            }
            catch (Exception ex)
            {
                result.IsVaild = false;
                result.ErrorMembers = new List<ErrorMember>();
                result.ErrorMembers.Add(new ErrorMember()
                {
                    ErrorMessage = ex.Message,
                    ErrorMemberName = "Internal error"
                });
            }

            return result;
        }
        /// <summary>
        /// 获取类型的属性的DisplayName
        /// </summary>
        /// <param name="modelType"></param>
        /// <param name="propertyDisplayName"></param>
        /// <returns></returns>
        public static string GetDisplayName(object modelType, string propertyDisplayName)
        {
            return (System.ComponentModel.TypeDescriptor.GetProperties(modelType)[propertyDisplayName].Attributes[typeof(System.ComponentModel.DisplayNameAttribute)] as System.ComponentModel.DisplayNameAttribute).DisplayName;
        }
    }

    /// <summary>
    /// 错误名称和信息
    /// </summary>
    public class ErrorMember
    {
        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrorMessage { get; set; }
        /// <summary>
        /// 错误属性名称
        /// </summary>
        public string ErrorMemberName { get; set; }
    }

    /// <summary>
    /// 验证结果
    /// </summary>
    public class ValidResult
    {
        /// <summary>
        /// 错误集合
        /// </summary>
        public List<ErrorMember> ErrorMembers { get; set; }
        /// <summary>
        /// 错误状态,true表示验证成功
        /// </summary>
        public bool IsVaild { get; set; }
    }
}

3、上层使用验证帮助类,验证需要验证的数据模型类。

using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Validatetion;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            UserInfo userInfo = new UserInfo()
            {
                Name = "",
                Age = 101,
                Email = "sdfdfasdf",
                Phone = "133232131231231"
            };

            var validResult = ValidatetionHelper.IsValid(userInfo);
            if (!validResult.IsVaild)
            {
                foreach (ErrorMember errorMember in validResult.ErrorMembers)
                {
                    Console.WriteLine(errorMember.ErrorMessage);
                }
            }

            Console.Read();
        }
    }
}

4、运行结果

在这里插入图片描述

5、Demo如下:

环境:VS2017和.net framework 4.5.2
控制台程序运行 上面是全部代码,不会的可以自行下载
Demo下载地址

6、使用总结及注意事项

6.1、注意DisPlayName的获取,不能使用ErrorMemberName = item.MemberNames.FirstOrDefault(),这个获取到的是属性名(Name,Age等),无法获取汉字;

6.2、特性错误信息写法[Required(ErrorMessage = “必须填写”)],不能使用这种方式[Required(ErrorMessage = “{0}必须填写”)],否则会自动填充属性名(Name,Age等);

6.3、System.ComponentModel.DataAnnotations 这个dll需要从引用中添加,直接using是没有的;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
您可以使用`System.Diagnostics.Process`类来启动控制台并将其嵌入到WinForm窗口。 首先,您需要在WinForm添加一个`Panel`控件,然后将其命名为`consolePanel`。然后使用以下代码启动控制台并将其嵌入到该面板: ```csharp // 启动控制台进程 Process process = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardInput = true; process.Start(); // 将控制台窗口嵌入到WinForm IntPtr handle = process.MainWindowHandle; SetParent(handle, consolePanel.Handle); // 设置控制台窗口位置和大小 SetWindowLong(handle, GWL_STYLE, WS_VISIBLE | WS_CHILD); MoveWindow(handle, 0, 0, consolePanel.Width, consolePanel.Height, true); ``` 请注意,您需要导入以下WinAPI函数: ```csharp [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", SetLastError = true)] static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); [DllImport("user32.dll", SetLastError = true)] static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); const int GWL_STYLE = -16; const uint WS_VISIBLE = 0x10000000; const uint WS_CHILD = 0x40000000; ``` 当您运行应用程序时,将会在WinForm窗口嵌入一个控制台。您可以使用`process.StandardInput`属性向控制台发送命令,并使用`process.StandardOutput`属性获取控制台输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远之后2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值