百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

NET Core-学习笔记(三)

connygpt 2024-11-28 08:07 10 浏览

这里将要和大家分享的是学习总结第三篇;首先感慨一下这周跟随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字样的路由,代码如下:

 1 [AcceptVerbs("Get", "Post")]
 2         public JsonResult IsContainerBlogs(string title)
 3         {
 4 
 5 if (!title.Contains("Blogs") || string.IsNullOrEmpty(title))
 6  {
 7 
 8 return Json("Title里面没有Blogs字样!");
 9  }
10 return Json(true);
11         }

View Code

这里的特性AcceptVerbs,主要是用来限制只允许get,post请求

然后,定义个文章实体如下格式:

1  public class Article
2     {
3         [Required]
4         public int ID { get; set; }
5 
6         [Remote(action: "IsContainerBlogs", controller: "ArticlesFormat")]
7         public string Title { get; set; }
8         public DateTime CreateTime { get; set; }
9     }

View Code

并且通过自动生成对应的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:

 1  public class ModelRegexExtendAttribute : ValidationAttribute
 2     {
 3         private string _pattern;
 4         public ModelRegexExtendAttribute(string pattern = @"\d+", string errorMessage = "必须满足正则")
 5         {
 6 _pattern = pattern;
 7 this.ErrorMessage = errorMessage;
 8         }
 9 
10 
11         protected override ValidationResult IsValid(object value, ValidationContext validationContext)
12         {
13 //validationContext.DisplayName:指定某个实体类的属性
14 //获取指定属性的相关属性信息
15 var t = validationContext.ObjectType.GetProperty(validationContext.DisplayName);
16 //获取对应属性的值
17 var p = t.GetValue(validationContext.ObjectInstance, null);
18 
19 //做正则做匹配
20 if (Regex.IsMatch(p.ToString.ToUpper, _pattern))
21  {
22 
23 return ValidationResult.Success;
24  }
25 
26 return new ValidationResult(this.ErrorMessage);
27         }
28 
29     }

View Code

使用这个这个自定义的验证,和上面的验证是一样的:

测试的话,重新运行dotnet run,然后刷新刚才添加文字的页面,具体验证操作和上面一样

3.创建一个接口支持返回json,xml两种数据格式

首先,我们创建一个名为ArticlesFormatController的Controller(其实就是第二点说的那个Controller),然后通过注入ApplicationDbContext访问文章的列表数据(这里大家可以看下 学习笔记(一)的链接数据库),ArticlesFormatController具体实现的方法有:

 1  public class ArticlesFormatController : Controller
 2     {
 3 
 4         private readonly ApplicationDbContext _context;
 5 
 6         public ArticlesFormatController(ApplicationDbContext context)
 7         {
 8 
 9 _context = context;
10         }
11 
12         [Route("[controller]/[action]")]
13         public async Task<List<Article>> GetArticles
14         {
15 
16 return await _context.Article.ToListAsync;
17         }
18 
19 
20         //[Route("[controller]/[action]/{id}.{format?}")]
21         public async Task<Article> GetArticle(int? id)
22         {
23 
24 if (id == null)
25  {
26 
27 return new Article;
28  }
29 return await _context.Article.Where(b => b.ID == id).SingleOrDefaultAsync;
30         }
31 
32         public string GetArticleName(int? id)
33         {
34 if (id == null)
35  {
36 
37 return string.Empty;
38  }
39 return _context.Article.Where(b => b.ID == id).SingleOrDefaultAsync.Result.Title;
40         }
41 
42 
43         [AcceptVerbs("Get", "Post")]
44         public JsonResult IsContainerBlogs(string title)
45         {
46 
47 if (!title.Contains("Blogs") || string.IsNullOrEmpty(title))
48  {
49 
50 return Json("Title里面没有Blogs字样!");
51  }
52 return Json(true);
53         }
54 
55     }

View Code

此时在浏览器访问文章列表的路由:http://localhost:5000/ArticlesFormat/GetArticles得到如下图:

此时定义的Controller返回的是json数据,这个是框架默认的返回json;

接下来,在Startup.cs文件的ConfigureServices服务方法中,找到默认生成的services.AddMvc代码,我们改造成这样:

1 services.AddMvc(op =>
2  {
3 
4 op.OutputFormatters.Add(new XmlSerializerOutputFormatter);
5 }).AddXmlSerializerFormatters;

View Code

生成的时候会报错,直接复制我这里的代码有问题,因为找不到某个包,这里需要通过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格式的数据方式就完成了,大家可以试试,今天就这里,谢谢。

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&amp;Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick &#39;n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...