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 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
随机推荐
- centos7 双网卡同网段双网关配置
需求: #1.服务器为双网卡: #2.网卡1为互联网 172.16.137.99/24/254 #3.网卡2为旅游专网 172.16.137.97/24/1 #4.互联网路由器为172.16.137. ...
- connect ETIMEDOUT at PoolConnection.Connection._handleConnectTimeout
运行 node .\app.js时报错,显示数据库连接超时 此时再运行一次node .\app.js即可
- 在Tomcat中部署Web项目的操作方法(必看篇)
在这里介绍在Tomcat中部署web项目的三种方式: 1.部署解包的webapp目录 2.打包的war文件 3.Manager Web应用程序 一:部署解包的webapp目录 将Web项目部署到Tom ...
- 转L:[JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)
[JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇) JVM--Java虚拟机详解
- SSM框架 拦截器 出现“发现了以元素 'mvc:exclude-mapping' 开头的无效内容。应以 '{"http://www.springframework.org/schema/mvc":mapping}' 之一开头”错误
导致错误位置与代码: spring-mvc.xml文件中的拦截器配置代码,代码如下: <mvc:interceptors> <mvc:interceptor> <mvc: ...
- windows下解决mysql5中文乱码的问题
1.问题描述:一开始无论是在命令行,还是在mysql的客户端输入中文都会出现 "???" 问题之类的乱码问题: 2.解决办法: 1)cmd 进入mysql ,命令mysql -ur ...
- Coursera Programming Languages, Part B 华盛顿大学 Week 2
Datatype-programming in Racket without structs 在 ML 语言中,我们使用 datatype binding 来实现对 标签联合类型的构建:传送门 这是因 ...
- vs2015当前不会命中断点,还没有为该文档
经百度,需在项目>项目属性>生成>优化代码的勾去掉>保存>再次F11调试可解决
- 微信小程序:微信web开发阶段性学习总结
小程序运行机制 前台/后台状态 小程序启动后,界面被展示给用户,此时小程序处于前台状态. 当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有完全终止运行,而是进入了 ...
- AutoCAD_2020_Simplified_Chinese_Win_64bit_dlm
「AutoCAD_2020_Simplified_Chinese_Win_64bit_dlm」https://www.aliyundrive.com/s/zN8zAGgXZ58 点击链接保存,或者复制 ...