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; }

}

原文地址:https://www.cnblogs.com/tianjiuyi/p/10212559.html

时间: 2024-11-07 14:38:24

Asp.Net Core 程序开发技巧汇总的相关文章

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

转 http://www.cnblogs.com/linezero/p/5497472.html ASP.NET Core WebAPI 开发-新建WebAPI项目 ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄露的VS2015 Tooling,需要VS2015 Update 2. .NET Core 1.0.0 RC2 SDK Preview

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

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄露的VS2015 Tooling,需要VS2

在 ASP.NET Core 程序启动前运行你的代码

原文:在 ASP.NET Core 程序启动前运行你的代码 一.前言# 在进行 Web 项目开发的过程中,可能会存在一些需要经常访问的静态数据,针对这种在程序运行过程中可能几乎不会发生变化的数据,我们可以尝试在程序运行前写入到缓存中,这样在系统后续使用时就可以直接从缓存中进行获取,从而减缓因为频繁读取这些静态数据造成的应用数据库服务器的巨大承载压力. 既然需要在程序运行前将静态数据写入到缓存中,毫无疑问我们需要在程序运行前执行一些自定义功能的代码,那么在本章中,我将会介绍如何在 ASP.NET

ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统

一.创建项目 本篇文章介绍如何将一个ASP.NET Core Web程序部署到Windows系统上.这里以ASP.NET Core WebApi为例进行讲解.首先创建一个ASP.NET Core WebApi项目,使用默认的Values控制器,这里使用Visual Studio 2019创建一个ASP.NET Core 3.1d的WebApi项目. 创建新项目的时候选项ASP.NET Core Web应用程序,如下图所示: 配置新项目界面界面设置项目名称和位置,如下图所示: 选择.Net Cor

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

原文:ASP.NET Core 奇淫技巧之伪属性注入 一.前言 开局先唠嗑一下,许久未曾更新博客,一直在调整自己的状态,去年是我的本命年,或许是应验了本命年的多灾多难,过得十分不顺,不论是生活上还是工作上.还好当我度过了所谓的本命年后,许多事情都在慢慢变好,我将会开始恢复更新博客,争取恢复到以前的速度上(因为工作比较忙,所以这个过程可能需要一段时间). 二.关于属性注入 说到属性注入,我们就不得不提一下 DI(Dependency Injection),即依赖注入,用过 ASP.NET Core

如何优雅的利用Windows服务来部署ASP.NET Core程序

上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法,其中有一种方式是通过Windows服务来进行部署,这样既可以做到开启自启动,又不会因为iis的反向代理而损失部分性能.但是美中不足的是需要借助第三方软件nssm来进行,那么有没有更好并且优雅的方式来进行ASP.NET Core网站的Windows服务方式部署呢?答案是肯定的! 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10380887.html 今天这篇文章我会利用番茄工作法来

微信小程序开发技巧总结(持续更新...)

小程序开发技巧总结 结合自己在平时的开发中遇到的各种问题,和浏览各种问题的解决方案总结出一些自己在日常开发中常用的技巧和知点,希望各位不吝斧正. 数据的生命周期 1.短生命周期数据存储 以小程序启动到彻底关闭为周期的的数据建议存储在app.js文件夹中,引用app.js: const app =getApp(); 假设Value是在小程序本次生命周期中经常使用到的一个数据,比如说请求API的Token,动态的令牌等.那么就可以把这个值赋值到全局变量中去.实际上,并不是只有app.js中的glob

ASP.NET Core教程:ASP.NET Core程序部署到Linux

一.前言 这篇文章我们将讲解如何将ASP.NET Core 程序部署到Linux.这里我们使用的是虚拟机里面安装的Centos7.这里的ASP.NET Core程序,以上篇文章中发布的框架依赖文件为例进行讲解. 二.安装运行时环境 1.在线安装 我们只是在Linux系统上面部署应用程序,所以只需要安装ASP.NET Core Runtime即可.在安装.NET之前,我们需要先注册Microsoft密钥和源,在终端里面执行下面的命令: sudo rpm -Uvh https://packages.

小程序开发技巧总结

前言 最近公司要开发一款电商小程序,匆忙看了一遍文档就开始干活了.整体开发体验个人感觉不太好,特别是如果之前习惯了Vue开发,突然去开发小程序,感觉很鸡肋.以下是我在开发中遇到的一些问题以及解决方法的总结,仅供参考 引入iconfont 在小程序中引入字体图标要比web麻烦一些,简单说需要三步: 下载iconfont,把iconfont.css复制到iconfont.wxss,在app.wxss中引入 查看iconfont在unicode模式下的在线链接,替换iconfont.wxss中的链接为