ASP.NET Core MVC学习笔记
最近由于疫情紧张,遂在家办公,在领导的带领下,学习了一下.Net Core MVC。
一,构建web应用
1.选择c#-所有平台-web 找到ASP.NET Core web应用程序
2.项目命名之后转至如下界面:选择Web应用程序(模型视图控制器)。
Ok点击创建,这个项目的基本框架就生成了。
二,EF-Code First 数据迁移
1,在Models里面新建实体类和数据库上下文类,并添加相对应的引用和框架
具体代码如下:
实体类:
public class InfoUser
{
[Key]
[StringLength()]
[DisplayName("用户名")]
[Required(ErrorMessage = "用户名不能为空")]
public string UserName { get; set; }
[StringLength()]
[DisplayName("密码")]
[Required(ErrorMessage = "密码不能为空")]
public string Password { get; set; }
[DisplayName("创建日期")]
public DateTime DTCreate { get; set; }
[DisplayName("登陆日期")]
public DateTime DTLogin { get; set; } public byte[] HeaderImg { get; set; }
}
/// <summary>
/// 博客表
/// </summary>
public class InfoBlog
{
public int ID { get; set; }
[StringLength()]
public string UserName { get; set; }
[StringLength()]
public string Title { get; set; } public string Content { get; set; }
public int VisitCount { get; set; }
public DateTime DTCreate { get; set; }
}
/// <summary>
/// 回复表
/// </summary>
public class InfoReply
{
public int ID { get; set; }
public int BlogID { get; set; }
[StringLength()]
public string UserName { get; set; }
public string Content { get; set; }
public DateTime DTCreate { get; set; }
}
/// <summary>
/// 日志表
/// </summary>
public class InfoLog
{
public int ID { get; set; }
[StringLength()]
public string Title { get; set; }
public string Content { get; set; }
public DateTime DTCerate { get; set; } }
上下文类(需要继承DbContext):
public class DBXlp : DbContext
{
public DBXlp(DbContextOptions<DBXlp> options)
: base(options)
{ }
//add-migration init update-database
public DbSet<InfoUser> InfoUsers { get; set; }
public DbSet<InfoBlog> InfoBlogs { get; set; }
public DbSet<InfoReply> InfoReplies { get; set; }
public DbSet<InfoLog> InfoLogs { get; set; } }
2,通过NuGet添加下面的两个包
3,在appsettings.json里面添加连接数据库的字符串
{
"ConnectionStrings": {
"DbXlp": "Server=.;Database=dbXlp;User id=sa;Password=123456"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
4,然后在 Startup.cs 的 ConfigureServices(IServiceCollection services) 中,我们作为一个服务注册了上下文对象。
services.AddDbContext<DBXlp>(options=>options.UseSqlServer(Configuration.GetConnectionString("DbXlp")));
5,打开 工具->NuGet包管理器->程序包管理器控制台
- 输入命令:add-migration init(可随意)(为挂起的Model变化添加迁移脚本 )
- 输入命令:update-database( 将挂起的迁移更新到数据库 )
Ok 可以看到下面数据库里已经有了对应表信息!
三,使用Identity进行登录验证
在Startup中:
1.定义一个string类型的CookieScheme作为认证方案
public const string CookieScheme = "Cookies";
2.ConfigureServices中使用AddCookie设置选项
services.AddAuthentication(CookieScheme)
.AddCookie(CookieScheme, option =>
{
// 登录路径:这是当用户试图访问资源但未经过身份验证时,程序将会将请求重定向到这个相对路径。
option.LoginPath = new PathString("/account/login");
// 禁止访问路径:当用户试图访问资源时,但未通过该资源的任何授权策略,请求将被重定向到这个相对路径
option.AccessDeniedPath = new PathString("/account/denied");
});
3.在
Configure
方法中使用 UseAuthentication来调用认证中间件(如下图所示位置)
控制器里面:
创建一个包含用户信息的 cookie
可以
构造一个ClaimsPrincipal。用户信息会被序列化然后保存在cookie 里面。
public async Task<ActionResult> Logining()
{
var userName = Request.Form["UserName"];
var password = Request.Form["Password"];
var item = db.InfoUsers.Find(userName);
if (item != null && password == item.Password)
{
item.DTLogin = DateTime.Now;
db.SaveChanges();
//用Claim来构造一个ClaimsIdentity,然后调用 SignInAsync 方法。
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, userName));
var claimsIdentity = new ClaimsIdentity(claims, "Cookies");
//登录
await HttpContext.SignInAsync("Cookies", new ClaimsPrincipal(claimsIdentity));
return RedirectToAction("Index", "Blog");
}
else
ViewBag.Msg = "登陆失败";
return View();
}
public async Task<IActionResult> Logout()
{
//退出
await HttpContext.SignOutAsync("Cookies");
return RedirectToAction("Index", "Home"); }
然后我们只需要对那些需要授权登陆才能执行的界面或者操作标记[Authorize]即可:
最后我们也可以在Razor中判断是否授权成功:
@if (User.Identity.IsAuthenticated)
{
<textarea id="TextArea1" rows="10" class="form-control"></textarea>
<button onclick="Reply()" class="btn btn-primary">回复</button>
}
else
{
<a asp-action="Login" asp-controller="Account">登录</a>
}
就写到这里。下次继续!
ASP.NET Core MVC学习笔记的更多相关文章
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
sql server 关于表中只增标识问题 由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- ASP.NET Core 2 学习笔记(七)路由
ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...
- ASP.NET Core 2 学习笔记(十二)REST-Like API
Restful几乎已算是API设计的标准,通过HTTP Method区分新增(Create).查询(Read).修改(Update)和删除(Delete),简称CRUD四种数据存取方式,简约又直接的风 ...
- ASP.NET Core 2 学习笔记(十)视图
ASP.NET Core MVC中的Views是负责网页显示,将数据一并渲染至UI包含HTML.CSS等.并能痛过Razor语法在*.cshtml中写渲染画面的程序逻辑.本篇将介绍ASP.NET Co ...
- ASP.NET Core 2 学习笔记(十三)Swagger
Swagger也算是行之有年的API文件生成器,只要在API上使用C#的<summary />文件注解标签,就可以产生精美的线上文件,并且对RESTful API有良好的支持.不仅支持生成 ...
- ASP.NET Core 2 学习笔记(一)开始
原文:ASP.NET Core 2 学习笔记(一)开始 来势汹汹的.NET Core似乎要取代.NET Framework,ASP.NET也随之发布.NET Core版本.虽然名称沿用ASP.NET, ...
- ASP.NET Core 2 学习笔记(六)MVC
ASP.NET Core MVC跟ASP.NET MVC观念是一致的,使用上也没有什么太大的变化.之前的ASP.NET MVC把MVC及Web API的套件分开,但在ASP.NET Core中MVC及 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter
在上一篇里,介绍了中间件的相关内容和使用方法.本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别. 第一部分.MVC框架内置过滤器 下图展示了As ...
随机推荐
- 异数OS 星星之火(三)--异数OS-织梦师云 微服务编写入门
. 异数OS 星星之火(三)–异数OS-织梦师云 微服务编写入门 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 6 ...
- 学习Python中遇到的各种错误
错误列表 TypeError : 'moudle' object is not callable 错误:TypeError : 'moudle' object is not callable 代码: ...
- leetcode 全解(python版)
本着blabla的精神,在这里(可能会)给出leetcode的全部习题答案 --持续更新中... 1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整 ...
- 创建dynamics CRM client-side (六) - form & field notification
form 和 field 的notification在开发当中会经常使用到 // Converting functions to Namespace Notation var Sdk = window ...
- DOM中的位置和大小(总结)
[window]window对象 一.position位置 screenLeft/screenTop (适用于火狐和谷歌) screenX/screenY (适用于IE) 二.size大小 inner ...
- Linux中inode详解
转自:https://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在 ...
- java单例五种实现模式梳理
java单例五种实现模式 饿汉式(线程安全,调用效率高,但是不能延时加载) 一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式.但是问题也比较明显.单例在 ...
- equals()和hashCode()使用总结
equals()和hashCode()使用总结 equals() Object类中的equals方法和"=="是一样的,没有区别,即俩个对象的比较是比较他们的栈内存中存储的内存地址 ...
- 使用Gradle构建springboot多模块项目,并混合groovy开发
idea设置本地gradle 打包: build.gradle //声明gradle脚本自身需要使用的资源,优先执行 buildscript { ext { springBootVersion = ' ...
- 推荐一本学习Groovy的书籍Groovy程序设计!
有朋友公司在用groovy开发,于是推荐我学习一下,搜到了这本书: 花了一个月时间读完了这本书!写的很棒,几乎没有废话,全书都是很重要的知识点和很好的讲解,确实像封面说的那样,使用的好可以提高开发效率 ...