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 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
随机推荐
- gin面试题
1.gin绑定前端提交的数据到结构体 json,shouldbindjson,postform,query拿到get方法或者路由拼接这些 2.gin框架中间件多个执行顺序 3.中间件实现原理 4.设计 ...
- CF319D 题解
题意 传送门 给你一个字符串 \(S\),要求你每次找到一个最短的并且最左边的形如 \(XX\)(即由两个相同的字符串拼接而成)的子串,然后把这个字符串从 \(XX\) 变成 \(X\).问无法操作后 ...
- fabric2.2学习笔记1
fabric2.2学习笔记1 20201303张奕博 2023年1月9日 hyperledger fabric 结构分析 每个Server作用: AdminServer:控制该节点的命运,可以删除该节 ...
- 关于Windows系统TCP参数修改
在做压测时,往往会因为TCP连接数较少,导致并发数上不去就报错,下面我们一起看看如何修改Windows的TCP参数 1.本地注册表 打开注册表快捷键:Windows+R建,输入regedit,按下键盘 ...
- tzoj:3613 突破包围
http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3613 算出两两之间min距离,然后从起点开 ...
- 微信小程序云开发,快速生成短信验证码
使用微信小程序云函数实现注册短信验证码的管理,并不是一件分分钟的事,目前想要存储验证码只能放到数据库中,因为存储后才能和用户提交上来的验证码做比较. 管理验证码主要涉及到:生成.存储.校验.有效期管理 ...
- 利用python脚本统计和删除redis key
该脚本扫描redis中所有的key,用于分析redis内存数据的key构成,扫描并保存文件,需要python支持redis模块. #!/usr/bin/env python # -*- coding: ...
- 3.17阿里Java后端,电商 sku 的全排列算法
3.17阿里Java后端 字典 有英文字典:Map<Character, String[]>,示例如下: a : [a, an] b : [bus, bird] c : [car, can ...
- Write down for Segments, Extents, and Blocks
Segments, Extents, and Blocks(段.区.块) • Segments exist in a tablespace. • Segments are collections of ...
- 基于Python接口自动化测试持续集成----在jenkins创建任务->检出git的代码-->生成报告-->发送邮件
步骤一:先在jenkins创建一个自由风格的任务 步骤二:然后在源码管理选择git检出代码的方式,需要提供代码所在git的路径和登录git的账号和密码 步骤三:返回到任务配置的界面,先在构建后操作增加 ...