LINQ中的数据模型验证
在讲MVC的token的时候,我简单的说了一下如果用LINQ生成实体的话如何做业务逻辑验证。现在我来详细说一下:
我在OnuserMailChanging方法中去判断传入的Value是否是邮件格式,这个方法会在实体赋值的时候(set)的时候就调用,如果格式错误,则报错,不再进行赋值,如果我们试图在Changing方法中就对value进行过滤HTML字符的操作,那么实际上是无效的,首先是形参跟实参的关系,改了value的值实际上不会更改到实参的值,其次如果在Changing方法里面就更改_userMail字段的值,如下所示:
在Changing事件中过滤并且赋值给字段,这么改实际上是可行的,但是留意下desinger类里面的set处理中当调用完Changing事件之后又会把value值重新赋给字段,那么之前Changing事件里面所做的赋值操作实际上是没有意义的。有人说可以把后面的赋值代码去掉,实际上desinger类不主张修改,因为该类是自动生成的,你所做的修改实际上下次更改layout的时候又会被覆盖掉了。最好的做法是把过滤放到Changed事件里面,留意下set处理中Changed事件是在赋值后,所以在里面更改字段的值是有意义的,如:
这样把Changing与Changed相结合,在实体中即做格式验证,又做脚本过滤,才能使实体更加健壮!
[Column(Storage="_userMail", DbType="VarChar(100)")]
public string userMail
{
get
{
return this._userMail;
}
set
{
if ((this._userMail != value))
{
this.OnuserMailChanging(value);
this.SendPropertyChanging();
this._userMail = value;
this.SendPropertyChanged("userMail");
this.OnuserMailChanged();
}
}
}
public string userMail
{
get
{
return this._userMail;
}
set
{
if ((this._userMail != value))
{
this.OnuserMailChanging(value);
this.SendPropertyChanging();
this._userMail = value;
this.SendPropertyChanged("userMail");
this.OnuserMailChanged();
}
}
}
上面代码是dbml的designer类,是由LINQ自动生成的代码,从代码中可以看到LINQ为userMail的字段生成了get,set方法,留意一下set方法里面,首先调用了this.OnuserMailChanging(value)的方法,也就是说我们可以在这个方法里面做一些业务逻辑的判断,如:
partial void OnuserMailChanging(string value)
{
Regex reg = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
if (!reg.IsMatch(value))
{
throw new ArgumentException("format error!");
}
}
{
Regex reg = new Regex(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
if (!reg.IsMatch(value))
{
throw new ArgumentException("format error!");
}
}
我在OnuserMailChanging方法中去判断传入的Value是否是邮件格式,这个方法会在实体赋值的时候(set)的时候就调用,如果格式错误,则报错,不再进行赋值,如果我们试图在Changing方法中就对value进行过滤HTML字符的操作,那么实际上是无效的,首先是形参跟实参的关系,改了value的值实际上不会更改到实参的值,其次如果在Changing方法里面就更改_userMail字段的值,如下所示:
partial void OnuserMailChanging(string value)
{
_userMail = FilterContent(_userMail);
}
{
_userMail = FilterContent(_userMail);
}
在Changing事件中过滤并且赋值给字段,这么改实际上是可行的,但是留意下desinger类里面的set处理中当调用完Changing事件之后又会把value值重新赋给字段,那么之前Changing事件里面所做的赋值操作实际上是没有意义的。有人说可以把后面的赋值代码去掉,实际上desinger类不主张修改,因为该类是自动生成的,你所做的修改实际上下次更改layout的时候又会被覆盖掉了。最好的做法是把过滤放到Changed事件里面,留意下set处理中Changed事件是在赋值后,所以在里面更改字段的值是有意义的,如:
partial void OnuserMailChanged()
{
_userMail = FilterContent(_userMail);
}
{
_userMail = FilterContent(_userMail);
}
这样把Changing与Changed相结合,在实体中即做格式验证,又做脚本过滤,才能使实体更加健壮!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述