使用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 程序开发技巧汇总的更多相关文章

  1. ASP.NET Core 企业级开发架构简介及框架汇总

    企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成若干小的应用实现系统功能的架构,同时这样的系 ...

  2. ASP.NET Core 企业级开发架构简介及框架汇总 (转载)

    ASP.NET Core 企业开发架构概述 企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成 ...

  3. 《ASP.NET Core应用开发入门教程》与《ASP.NET Core 应用开发项目实战》正式出版

    “全书之写印,实系初稿.有时公私琐务猬集,每写一句,三搁其笔:有时兴会淋漓,走笔疾书,絮絮不休:有时意趣萧索,执笔木坐,草草而止.每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不 ...

  4. ASP.NET Core WebAPI 开发-新建WebAPI项目

    ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...

  5. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  6. 如何在ASP.NET Core程序启动时运行异步任务(3)

    原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...

  7. 从头认识一下docker-附带asp.net core程序的docker化部署

    从头认识一下docker-附带asp.net core程序的docker化部署 简介 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是 ...

  8. 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf

    <ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...

  9. ASP.NET Core WebAPI 开发-新建WebAPI项目 转

    转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目   ASP.NET Core We ...

  10. ASP.NET Core 奇淫技巧之伪属性注入

    一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变 ...

随机推荐

  1. gin面试题

    1.gin绑定前端提交的数据到结构体 json,shouldbindjson,postform,query拿到get方法或者路由拼接这些 2.gin框架中间件多个执行顺序 3.中间件实现原理 4.设计 ...

  2. CF319D 题解

    题意 传送门 给你一个字符串 \(S\),要求你每次找到一个最短的并且最左边的形如 \(XX\)(即由两个相同的字符串拼接而成)的子串,然后把这个字符串从 \(XX\) 变成 \(X\).问无法操作后 ...

  3. fabric2.2学习笔记1

    fabric2.2学习笔记1 20201303张奕博 2023年1月9日 hyperledger fabric 结构分析 每个Server作用: AdminServer:控制该节点的命运,可以删除该节 ...

  4. 关于Windows系统TCP参数修改

    在做压测时,往往会因为TCP连接数较少,导致并发数上不去就报错,下面我们一起看看如何修改Windows的TCP参数 1.本地注册表 打开注册表快捷键:Windows+R建,输入regedit,按下键盘 ...

  5. tzoj:3613 突破包围

    http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=3613 算出两两之间min距离,然后从起点开 ...

  6. 微信小程序云开发,快速生成短信验证码

    使用微信小程序云函数实现注册短信验证码的管理,并不是一件分分钟的事,目前想要存储验证码只能放到数据库中,因为存储后才能和用户提交上来的验证码做比较. 管理验证码主要涉及到:生成.存储.校验.有效期管理 ...

  7. 利用python脚本统计和删除redis key

    该脚本扫描redis中所有的key,用于分析redis内存数据的key构成,扫描并保存文件,需要python支持redis模块. #!/usr/bin/env python # -*- coding: ...

  8. 3.17阿里Java后端,电商 sku 的全排列算法

    3.17阿里Java后端 字典 有英文字典:Map<Character, String[]>,示例如下: a : [a, an] b : [bus, bird] c : [car, can ...

  9. Write down for Segments, Extents, and Blocks

    Segments, Extents, and Blocks(段.区.块) • Segments exist in a tablespace. • Segments are collections of ...

  10. 基于Python接口自动化测试持续集成----在jenkins创建任务->检出git的代码-->生成报告-->发送邮件

    步骤一:先在jenkins创建一个自由风格的任务 步骤二:然后在源码管理选择git检出代码的方式,需要提供代码所在git的路径和登录git的账号和密码 步骤三:返回到任务配置的界面,先在构建后操作增加 ...