分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Asp.Net Core 程序开发技巧汇总

发布时间:2023-09-06 02:28责任编辑:郭大石关键词:暂无标签

使用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 程序开发技巧汇总

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved