Asp.Net Core 程序开发技巧汇总
使用Sqlite数据库
创建项目
Asp.Net Core Web应用程序
Web应用程序 ASP.NET Core 2.2
NuGet管理,添加Sqlite数据库支持
Microsoft.EntityFrameworkCore.Sqlite
添加数据实体类
添加文件夹Models
在Models文件夹添加类 Test Context
using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; namespace WebApplication1.Models { public class TestContext:DbContext { public TestContext(DbContextOptions<TestContext> options) : base(options) { } public DbSet<Person> People { get; set; } public DbSet<Book> Books { get; set; } } public class Person { [Display( Name ="编号")] public int PersonID { get; set; } [Display(Name ="姓名")] public string PersonName { get; set; } [Display(Name ="书籍")] public List<Book> Books { get; set; } } public class Book { [Display(Name ="编号")] public int BookID { get; set; } [Display(Name ="书名")] public string BookName { get; set; } [Display(Name ="人员编号")] public int PersonID { get; set; } [Display(Name ="人员")] public Person Person { get; set; } } }
更改Startup.cs文件
添加引用
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Sqlite;
更新以下过程
public void ConfigureServices(IServiceCollection services) { …… //实现注入 var dbpath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.db"); var connstr = $"Data Source={dbpath}"; services.AddDbContext<TestContext>(options => options.UseSqlite(connstr)); //自动创建数据库 var builder = new DbContextOptionsBuilder<TestContext>(); builder.UseSqlite(connstr); using (var db = new TestContext(builder.Options)) { db.Database.EnsureCreated(); } …… }
添加Razor页面实现数据的增删改查
在Pages目录增加子目录 People和Books
在People目录右击鼠标,选择添加 新搭建基架的项目
选择使用实体框架生成Razor页面(CRUD)
在Books目录右击鼠标,选择添加 新搭建基架的项目
选择使用实体框架生成Razor页面(CRUD)
安装配置 Session
NuGet 添加引用
Microsoft.AspNetCore.Session
Session 是基于 IDistributedCache 构建的,所以必须引用一种 IDistributedCache 的实现,ASP.NET Core 提供了多种 IDistributedCache 的实现 (Redis、SQL Server、In-memory)
修改Startup.cs文件
public void ConfigureServices(IServiceCollection services) { …… services.AddDistributedMemoryCache(); services.AddSession(); …… } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { …… app.UseSession(); …… }
使用Session
设置Session变量
public async Task OnGetAsync() { Book = await _context.Books .Include(b => b.Person).ToListAsync(); var s = "hello world @ " + DateTime.Now.ToString(); var b1 = System.Text.Encoding.UTF8.GetBytes(s); HttpContext.Session.Set("key1", b1); }
读取Session变量
public async Task OnGetAsync() { Person = await _context.People.ToListAsync(); byte[] data; var b = HttpContext.Session.TryGetValue("key1", out data); var s = System.Text.Encoding.UTF8.GetString(data); ViewData["key1"] = s; }
通过字段属性实现数据校验
字段属性使用范例
[Display(Name ="分组编号")] public int GroupID { get; set; } [Display(Name ="分组名称")] [Required(ErrorMessage = "分组名称不能为空")] [RegularExpression(@"^[a-zA-Z]+[0-9]*", ErrorMessage = "只能使用英文字母和数字,并且第一个符号必须为英文字母。")] [StringLength(20,MinimumLength =3,ErrorMessage ="最短长度3,最大长度20")] public string GroupName { get; set; } [Display(Name ="学生列表")]
页面直接显示字段属性
列标题
@Html.DisplayNameFor(model => model.Administrator[0].UserName)
数据行
@Html.DisplayFor(modelItem => item.UserName)
使用正则表达式实现复杂校验
[RegularExpression(@"^[a-zA-Z]+[0-9]*", ErrorMessage = "只能使用英文字母和数字,并且第一个符号必须为英文字母。")]
自定义错误提示
ModelState的属性
这是一个类型为ModelStateDictionary的ModelState类型的字典集合。在进行数据验证的时候这个属性是比較实用的。在使用Html.ValidationMessage()的时候,就是从ViewData.ModelState中检測是否有指定的KEY。假设存在。就提示错误信息。
ModelState.AddModelError("LoginError", "登录失败");
页面上增加以下代码:
<span class="text-danger">@Html.ValidationMessage("LoginError")</span>
实现登录功能
添加Razor页面
页面代码如下:
@page @model CourseAssistant.Pages.Login.IndexModel @{ ViewData["Title"] = "登录"; } <h1>登录</h1> <hr /> <div class="row"> <div class="col-md-4"> <form method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="LoginEntry.UserName" class="control-label"></label> <input asp-for="LoginEntry.UserName" class="form-control" /> <span asp-validation-for="LoginEntry.UserName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="LoginEntry.Password" class="control-label"></label> <input asp-for="LoginEntry.Password" class="form-control" /> <span asp-validation-for="LoginEntry.Password" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="登录" class="btn btn-primary" /> <span class="text-danger">@Html.ValidationMessage("LoginError")</span> </div> </form> </div> </div> @section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }
更新IndexModel代码
public class IndexModel : PageModel { private readonly CourseAssistant.Models.CourseAssistantContext _context; public IndexModel(CourseAssistant.Models.CourseAssistantContext context) { _context = context; } [BindProperty] public LoginEntry LoginEntry { get; set; } public void OnGet() { } public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } var admin = await _context.Administrators.FirstOrDefaultAsync(m => m.UserName == LoginEntry.UserName && m.Password == LoginEntry.Password); if (admin != null) { this.SetCurrentUser(new LoginUser() { UserTyep = UserType.Administrator, Administrator = admin, Student = null }); return RedirectToPage("/Groups/Index"); } else { ModelState.AddModelError("LoginError", "登录失败"); return Page(); } } } public class LoginEntry { [Display(Name ="账号")] [Required(ErrorMessage = "用户名不能为空。")] [RegularExpression("^[a-zA-z]+[a-zA-z0-9]*",ErrorMessage ="只能使用英文和数字,并且第一个符号必须是英文")] [StringLength(20,MinimumLength =3,ErrorMessage="最大长度20,最小长度3")] public string UserName { get; set; } [Required(ErrorMessage = "密码不能为空。")] [DataType(DataType.Password)] [Display(Name = "密码")] [StringLength(20, MinimumLength = 3, ErrorMessage = "最大长度20,最小长度3")] public string Password { get; set; } }
实现文件上传功能
添加Razor页面
页面代码如下:
@page @model CourseAssistant.Pages.FileUploads.IndexModel @{ ViewData["Title"] = "文件上传"; } <h2>文件上传</h2> <hr /> <div class="row"> <div class="col-md-4"> <form method="post" enctype="multipart/form-data"> <div class="form-group"> <label asp-for="FileUpload.FileName" class="form-control"></label> <input asp-for="FileUpload.FileName" type="text" class="form-control" /> <span asp-validation-for="FileUpload.FileName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="FileUpload.FileData" class="form-control"></label> <input asp-for="FileUpload.FileData" type="file" class="form-control" style="height:auto;" /> <span asp-validation-for="FileUpload.FileData" class="text-danger"></span> </div> <input type="submit" value="上传" class="btn btn-primary" /> </form> </div> </div>
更新IndexModel代码
public class IndexModel : PageModel { public void OnGet() { } [BindProperty] public FileUpload FileUpload { get; set; } public async Task<IActionResult> OnPost() { var path = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Uploads"); if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); } path = System.IO.Path.Combine(path, $"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}_{FileUpload.FileData.FileName}"); var fs = System.IO.File.Open(path, System.IO.FileMode.Create, System.IO.FileAccess.Write); await FileUpload.FileData.CopyToAsync(fs); fs.Close(); fs.Dispose(); return Page(); } } public class FileUpload { [Required(ErrorMessage ="文件名不能为空")] [Display(Name ="文件名")] public string FileName { get; set; } [Required(ErrorMessage = "必须选择需要上传的文件")] [Display(Name ="选择文件")] public IFormFile FileData { get; set; } }
Asp.Net Core 程序开发技巧汇总的更多相关文章
- ASP.NET Core 企业级开发架构简介及框架汇总
企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成若干小的应用实现系统功能的架构,同时这样的系 ...
- ASP.NET Core 企业级开发架构简介及框架汇总 (转载)
ASP.NET Core 企业开发架构概述 企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成 ...
- 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版
“全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...
- ASP.NET Core WebAPI 开发-新建WebAPI项目
ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- 如何在ASP.NET Core程序启动时运行异步任务(3)
原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...
- 从头认识一下docker-附带asp.net core程序的docker化部署
从头认识一下docker-附带asp.net core程序的docker化部署 简介 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是 ...
- 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
<ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...
- ASP.NET Core WebAPI 开发-新建WebAPI项目 转
转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目 ASP.NET Core We ...
- ASP.NET Core 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
随机推荐
- 记一次对peer的理解
今天在使用react-native开发项目的时候,想要使用async-storage. 我用的rn版本是18.2.0,不带async-storage,所以我需要自己安装下载. 于是执行命令: npm ...
- RNN,LSTM,BERT
目录 RNN LSTM 计算公式 参数量计算 self-attention bert 论文 源码 问题 问题:bert中进行ner为什么没有使用crf:使用DL进行序列标注问题的时候CRF是必备嘛(t ...
- XJTUOJ #1193. 表象[弹幕偏执症]
题目 https://oj.xjtuicpc.com/problem/1193 恋恋天下第一!(然而本菜鸡总是被阿空锤死而根本开不了normal)TAT 思路 挺吓人的一道题,看起来很像是要匹配加字符 ...
- P1982 [NOIP2013 普及组] 小朋友的数字 题解
目录 简单版 题目 code 本题 code 简单版 先要会做这道题 题目 P1115 最大子段和https://www.luogu.com.cn/problem/P1115 这道题其实是动态规划,d ...
- 知识图谱demo net core + neo4j
知识图谱 基于neo4j数据库和.net core开发环境 Neo4j数据库的安装 安装neo4j数据库之前,需安装java的JDK文件,安装版本需与数据库保持一致,较新的neo4j数据库都需要至少j ...
- k8s排错(Unhealthy)
1,组件 Unhealthy 通过kubeadm安装好kubernetes v1.18.6 查看集群状态,发现组件controller-manager 和scheduler状态 Unhealthy
- python_列表和元组的转换
1, 通过list函数将元组的数据获取到,保存到新定义的列表里面.备注:元组的数据不会更改. info_tuple = ("小明", 24, 1.75) info_list = l ...
- JAVA第四五次大作业及期中考试总结
21201411-李英涵 继承与多态blog2 前言: 期中考试的题目还可以,因为给了类图,但是难度也逐渐升高. pta中的四的第一题和第三题较为简单,因为第一题的正则 ...
- PHP Redis - Hash (哈希)
Redis hash 是一个string类型的field和value的映射表,特别适合用于存储对象. Redis 中每个 hash 可以存储 232-1(4294967295) 键值对 赋值(hse ...
- python+pytest接口自动化
本篇文章是用python+pytest写了一个简单的接口自动化脚本,外加循环请求接口的语法,大家可以参考~ 实例一: import requestsimport pytestimport time c ...