NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇;首先感慨一下这周跟随netcore官网学习是遇到的一些问题:
a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列子测试实例,官网给出的一句话暂未发布最新包

b.某些资料不够详细只是一句话,加上网速慢,查阅资料不行啊
好了,感慨完后,下面是本篇将要分享的学习步奏,对于刚学或者即将要学习的朋友做个相互交流:
1.Model Validation(实体模型验证)
2.自定义验证属性
3.创建一个接口支持返回json,xml两种数据格式
下面一步一个脚印的来分享:
1.Model Validation(实体模型验证)
实体模型验证,直接通过添加注解的方式来定义需要验证的格式,要使用注解必须在实体类文件中引用System.ComponentModel.DataAnnotations该命名空间,写法如下:

红色框里面的就是用法,直接写在属性字段上方中括号('[]')括起来,小括号('()')里面是传递的参数,这里截图用到了Required:必填,StringLength(100):最小输入字符长度100,ClasssicMoive(1960):自定义验证,DataType(DataType.Date):属性为日期格式;还有很多常用的验证特性,具体可以去这个地址:https://docs.asp.net/en/latest/mvc/models/validation.html;
这里重点说这两个:
Remote(使用远程验证):通俗一点讲就是通过指定的路由去后台验证该属性的值知否有效,属于服务器验证;方法的实例用法如下(这里介绍一种用法,至于重载的方法各位可以试试):

这里需要的参数是routeName:就是路由,后面的一些属性非必填,咋们按照默认的来写一个
首先,定义一个验证是否包含有Blogs字样的路由,代码如下:
[AcceptVerbs("Get", "Post")]
public JsonResult IsContainerBlogs(string title)
{
if (!title.Contains("Blogs") || string.IsNullOrEmpty(title))
{
return Json("Title里面没有Blogs字样!");
}
return Json(true);
}
这里的特性AcceptVerbs,主要是用来限制只允许get,post请求
然后,定义个文章实体如下格式:
public class Article
{
[Required]
public int ID { get; set; } [Remote(action: "IsContainerBlogs", controller: "ArticlesFormat")]
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
并且通过自动生成对应的View和Controller(这里主要演示remote效果,具体生成view和Controller操作可以参照前面写的一篇: NET Core-学习笔记(一)),好的咋们启动dotnet run命令,访问创建文章的页面,先来看下Title属性生成的html代码:

红框的部分路径就是咋们之前在实体里面指定的Action和Controller的路由,再来看下效果:
没有Blogs会提示刚才路由定义方法返回的错误信息,

有Blogs的Title结果直接添加成功,

RegularExpression(使用正则写法验证):按照自定义的RegExp规则来验证数据的有效性;
还是用Title做例子,注释掉之前的Remote,换成RegularExpression,代码如:[RegularExpression(pattern:"d+",ErrorMessage ="不符合正则规则")],这里限制Title内容只能是数字,我们运行测试结果如下:

2.自定义验证属性
要实现自定义模型验证,需要继承:System.ComponentModel.DataAnnotations.ValidationAttribute,这里直接上代码,更详细的说明看下在代码注释里面创建一个ModelRegexExtendAttribute类继承ValidationAttribute:
public class ModelRegexExtendAttribute : ValidationAttribute
{
private string _pattern;
public ModelRegexExtendAttribute(string pattern = @"\d+", string errorMessage = "必须满足正则")
{
_pattern = pattern;
this.ErrorMessage = errorMessage;
} protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//validationContext.DisplayName:指定某个实体类的属性
//获取指定属性的相关属性信息
var t = validationContext.ObjectType.GetProperty(validationContext.DisplayName);
//获取对应属性的值
var p = t.GetValue(validationContext.ObjectInstance, null); //做正则做匹配
if (Regex.IsMatch(p.ToString().ToUpper(), _pattern))
{ return ValidationResult.Success;
} return new ValidationResult(this.ErrorMessage);
} }
使用这个这个自定义的验证,和上面的验证是一样的:

测试的话,重新运行dotnet run,然后刷新刚才添加文字的页面,具体验证操作和上面一样
3.创建一个接口支持返回json,xml两种数据格式
首先,我们创建一个名为ArticlesFormatController的Controller(其实就是第二点说的那个Controller),然后通过注入ApplicationDbContext访问文章的列表数据(这里大家可以看下 学习笔记(一)的链接数据库),ArticlesFormatController具体实现的方法有:
public class ArticlesFormatController : Controller
{ private readonly ApplicationDbContext _context; public ArticlesFormatController(ApplicationDbContext context)
{ _context = context;
} [Route("[controller]/[action]")]
public async Task<List<Article>> GetArticles()
{ return await _context.Article.ToListAsync();
} //[Route("[controller]/[action]/{id}.{format?}")]
public async Task<Article> GetArticle(int? id)
{ if (id == null)
{ return new Article();
}
return await _context.Article.Where(b => b.ID == id).SingleOrDefaultAsync();
} public string GetArticleName(int? id)
{
if (id == null)
{ return string.Empty;
}
return _context.Article.Where(b => b.ID == id).SingleOrDefaultAsync().Result.Title;
} [AcceptVerbs("Get", "Post")]
public JsonResult IsContainerBlogs(string title)
{ if (!title.Contains("Blogs") || string.IsNullOrEmpty(title))
{ return Json("Title里面没有Blogs字样!");
}
return Json(true);
} }
此时在浏览器访问文章列表的路由:http://localhost:5000/ArticlesFormat/GetArticles得到如下图:

此时定义的Controller返回的是json数据,这个是框架默认的返回json;
接下来,在Startup.cs文件的ConfigureServices服务方法中,找到默认生成的services.AddMvc()代码,我们改造成这样:
services.AddMvc(op =>
{ op.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddXmlSerializerFormatters();
生成的时候会报错,直接复制我这里的代码有问题,因为找不到某个包,这里需要通过nuget添加:Microsoft.AspNetCore.Mvc.Formatters.Xml包到项目中:

ok,此时再Startup.cs中就可以直接引用一个空间:using Microsoft.AspNetCore.Mvc.Formatters然后再生成下项目,这样是否不编译错误了呢;
接着,dotnet run再次运行启动项目,浏览器直接访问http://localhost:5000/ArticlesFormat/GetArticles出来的还是json数据,有些失望的感觉,但是通常接口形式都会指定接收属性类型Accept的类型,那么我们这样试试,使用DHCgoogle插件(其实就是post,get访问工具);
先来一个json数据:

截图有点大勿喷,再来一个xml返回的数据:

最后的图有点长,希望审核人员不要在意,这里的返回json和xml格式的数据方式就完成了,大家可以试试,今天就分享到这里,谢谢。
NET Core-学习笔记(三)的更多相关文章
- .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
原文https://www.cnblogs.com/artech/p/net-core-di-07.html 包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IS ...
- .NET CORE学习笔记系列(2)——依赖注入[6]: .NET Core DI框架[编程体验]
原文https://www.cnblogs.com/artech/p/net-core-di-06.html 毫不夸张地说,整个ASP.NET Core框架是建立在一个依赖注入框架之上的,它在应用启动 ...
- .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
- .NET CORE学习笔记系列(2)——依赖注入【3】依赖注入模式
原文:https://www.cnblogs.com/artech/p/net-core-di-03.html IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流 ...
- .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式
原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...
- .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
随机推荐
- 学点HTTP知识
不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...
- ExtJS 4.2 Date组件扩展:添加清除按钮
ExtJS中除了提供丰富的组件外,我们还可以扩展他的组件. 在这里,我们将在Date日期组件上添加一个[清除]按钮,用于此组件已选中值的清除. 目录 1. Date组件介绍 2. 主要代码说明 3. ...
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- C++随笔:.NET CoreCLR之GC探索(1)
一直是.NET程序员,但是.NET的核心其实还是C++,所以我准备花 一点时间来研究CoreCLR和CoreFX.希望这个系列的文章能给大家带来 帮助. GC的代码有很多很多,而且结构层次对于一个初学 ...
- C#泛型详解(转)
初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...
- C#使用Aspose.Cells导出Excel简单实现
首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...
- 【干货分享】流程DEMO-借款申请
流程名: 借款申请 业务描述: 当员工个人在工作中需要进行借款时,通过此项流程提交借款申请,审批通过后,财务部进行款项支付. 流程相关文件: 流程包.xml WebService业务服务.xm ...
- 【干货分享】流程DEMO-费用报销
流程名: 费用报销 业务描述: 流程发起时,要选择需要关联的事务审批单,会检查是否超申请,如果不超申请,可以直接发起流程,如果超了申请,需要检查预算,如果预算不够,将不允许发起报销申请,如果预算够用, ...
- Atitit 解决Unhandled event loop exception错误的办法
Atitit 解决Unhandled event loop exception错误的办法 查看workspace/.metadata/.log org.eclipse.swt.SWTError: No ...
- 分享一个php的启动关闭脚本(原)
自己简单写的一个php服务的启动脚本和大家分享 思路(实现的原理): 1:function模块+case语句多分支判断 2:通过添加# chkconfig: 2345 43 89注释实现开机自启动(前 ...