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 奇淫技巧之伪属性注入
一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...
随机推荐
- kubectl 补全报错:-bash: _get_comp_words_by_ref: command not found
1.kubectl自动补全设置 yum -y install bash-completion source <(kubectl completion bash) # 在 bash 中设置当前 s ...
- Pytorch Dropout函数
Dropout layers class torch.nn.Dropout(p=0.5, inplace=False) 随机将输入张量中部分元素设置为0.对于每次前向调用,被置0的元素都是随机的. 参 ...
- es6数组去重、数组中的对象去重 && 删除数组(按条件或指定具体元素 如:id)&& 筛选去掉没有子组件的父组件
// 数组去重 { const arr = [1,2,3,4,1,23,5,2,3,5,6,7,8,undefined,null,null,undefined,true,false,true,'中文' ...
- vue dialog弹窗
<el-dialog v-model="dialogFormVisible" :before-close="closeDialog" title=&quo ...
- 【MYSQL】group_concat长度问题分析
今天在生产环境发现一个ArrayIndexOutOfBounds的问题,经过排查,发现是group_concat拼接的字符串太长,超过了1024,导致报错. 我们可以通过 : SET [SESSION ...
- Window:下载并安装FileZilla客户端
FileZilla官方网站:https://filezilla-project.org/ 环境 操作系统:Window 10 企业版LTSC;内存:8GB;操作类型:64位. 说明 本人想在腾讯云的系 ...
- django学习:转载
https://www.cnblogs.com/ginvip/p/6894690.html https://www.cnblogs.com/yangmv/p/5327477.html https:// ...
- git和coding的使用
1.注册 coding ::::::https://coding.net/ 2.个人设置中添加上邮箱账号和密码 3.下载git 4.在coding中新建项目,并对项目初始化---生成分支,会生成url ...
- nchu第二次面向对象编程博客作业
前言: 本次博客包含的内容有pta题目集4(四边形).5(五边形)以及期中考试三次题目集.其中第四次和第五次题目集难度较大,比较复杂,涉及的知识点也比较多.而期中考试由于是在课堂上完成,难度较小, ...
- Java 基础(二)
类的初始 类中包括:属性,方法. 快速使用 我们都是人,而人的共同特点有很多. 比如:名字,年龄,性别,吃饭,睡觉... // 定义类 public class Person { // 定义属性 St ...