c#中的ASP.NET core

学习web首先要了解网址:https://hanyu.baidu.com/zici/s?srcid=28232&from=kg0
协议有两种:http:明文,不安全;https:加密;目前国家一般都要求以加密https证书加密方式访问网站。
www域,域名是3w后面的,如Baidu.com,最后是被翻译为ip地址。后面还有个端口后默认是:80隐藏了
域名端口后面是路径,?后面为参数。参数有两种请求方式:post请求,隐藏传递安全。get请求,显示传递不安全。

Program类:顶级程序

顶级程序的出现把main方法隐藏了,控制台应用程序有说过不在演示。

var builder = WebApplication.CreateBuilder(args);//定义默认web(服务器)主机,args是main方法传下来的,这里是顶级程序。
var app = builder.Build();//创建,服务器主机

app.MapGet("/", () => "Hello World!");//路由

app.Run();//运行,阻塞的调用,当我们停止,整个服务器就

https设置协议安全访问

var builder = WebApplication.CreateBuilder(args);//定义服务器主机
var app = builder.Build();//创建

if (!app.Environment.IsDevelopment())//当不是开发环境下进入
{ 
    app.UseHsts();//添加协议中间件,设置安全访问
}
app.UseHttpsRedirection();//遇到http也会自动跳转为https.

app.MapGet("/", () => "Hello World!");//路由
app.Run();//运行

项目启动配置:launchSettings.json

启动类:Startup

添加新建项,asp.net core下面有添加启动类:作用是把启动代码放到此类中,给顶级程序文件腾空。顶级程序少量代码调用即可。

using Microsoft.AspNetCore.Builder;

namespace asp.net
{
    public class Startup //项目启动类:两个方法框架自动调用
    {
        //添加服务的
        public void ConfigureServices(IServiceCollection services)
        { 
        
        }

        //中间件配置方法(项目启动中间件)
        public void Configure(IApplicationBuilder app,IWebHostEnvironment env)//参数1:请求管道中间件,自定义参数2:获取运行的环境信息
        {
            if (!env.IsDevelopment())//当不是开发环境下进入
            {
                app.UseHsts();//添加协议中间件,设置安全访问
            }

            app.UseRouting();//启动终结点路由(做选择)路由有两部分组成
            app.UseHttpsRedirection();//先启动路由在跳转https安全,顺序不能乱.

            app.UseEndpoints(endpoints =>//设置路由,最终的执行。
            {
                endpoints.MapGet("/", () => "Hello World!");
            });
        }
    }
}

顶级程序去调用

using asp.net;//引入启动类Startup命名空间
Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>
{
    webBuilder.UseStartup<Startup>();
}).Build().Run();//创建,启动

这种是老的方法,跟上个版本一样。

添加静态文件(网页html)

静态文件必须放在wwwroot文件夹里。

启动类中需要添加访问静态文件的中间件:app.UseStaticFiles();和默认首页中间件:app.UseDefaultFiles();启动项目可自动访问:index.html或default.html

public class Startup //项目启动类:两个方法框架自动调用
{
    //中间件配置方法(项目启动中间件)
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)//参数1:请求管道中间件,自定义参数2:获取运行的环境信息
    {
        if (!env.IsDevelopment())//当不是开发环境下进入
        {
            app.UseHsts();//添加协议中间件,设置安全访问
        }

        app.UseRouting();//路由有两部分组成:1.启动路由中间件;2.执行路由

        app.UseHttpsRedirection();//设置协议自动跳转https访问,和路由顺序不能乱.
        app.UseDefaultFiles();//默认文件中间件:index.html和default.html,项目启动时自动访问这两个其中一个做首页
        app.UseStaticFiles();//允许访问静态文件的中间件.如:网页html文件。必须在wwwroot文件夹下,这个代码必须在协议访问后面才安全

        app.UseEndpoints(endpoints =>//设置路由,最终的执行。
        {
            endpoints.MapGet("/ant", () => "Hello World!");//修改路由ant目录下才能访问文字了
        });
    }
}

添加Razor动态页

动态页必须放在pages目录下。且必须添加动态服务组和设置动态路由。

Razor动态页的构造:c#与html的混合页面,文件后缀为:cshtml 在页面了写c#代码提示,需要安装 工具(Razor Generator)

@page 必须在文件最顶部,表示这个页面是一个Razor动态页;@functions{ } 里可以写c#代码后台代码

创建cs文件用来隐藏后台代码,构造直接创建Razor动态页就是这种效果。

布局页(母板页)

标签帮助助手是可以将c#代码翻译为标签:*号表示所有标签,后面是程序包,在依赖项-框架里,可以创建一个Razor试图导入文件存放可以作用于全局使用

@addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers
<a asp-page="index">跳转首页</a>

 ViewData传值:键值对

ViewData["name"] = "后台:ViewData键值对方式,布局页可以直接传递";
@ViewData["name"] @*前台:显示传递的值*@

 ViewBag传值:变量,不过不能使用隐藏后台传,Title是变量名可更改。

@{
    ViewBag.Title = "首页"; //只能在前台定义了
}
@ViewBag.Title 

与数据库互交

先创建一个实体类,放Models文件夹下

namespace asp.net.Models
{
    public class Student
    {
        public int id { get; set; }//编号,默认约束指定:第一个属性名包含id大小都可以,默认为主键,如:uID
        public string name { get; set; }//姓名
        public string sex { get; set; }//性别
        public int age { get; set; }//年龄
    }
}

创建上下文类,放Data文件夹下

using asp.net.Models;
using Microsoft.EntityFrameworkCore;//使用EFCore框架必须要引入。
namespace asp.net.Data
{
    //创建一个操作OA数据库的上下文类
    public class NetContext : DbContext//必须继承ef框架提供的DbContext类,我们创建的上下文类是用来添加新功能的
    {
        //构造方法主要ef框架在用,有时用户也可能用到
        public NetContext()
        {
        }
        //其实这两个构造也是父类的构造,其实参数是给父类传递的。参数的意思是自动获取到连接数据库字符串
        public NetContext(DbContextOptions<NetContext> options) : base(options)
        {
        }

        public DbSet<Student> Student { get; set; }//用一个字段表示一个表。连接model用与生成表,默认属性名为表名

        //重写实现父类虚方法;作用是配置数据库
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //数据库连接字符串,写人appsettings.json配置文件里,由Startup.cs配置和调用,这里充当中间件服务功能。
        }
    }
}

配置数据库连接字符串:appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {//配置数据库连接字符串,NetContext是自定义取名,这里的server是连接vs自带的数据库。
    "NetContext": "server=(localdb)\\MSSQLLocalDB;database=OA;trusted_connection=true;MultipleActiveResultSets=true;"
  }
}

回到项目启动类Startup里配置调用数据库上下文类的一个服务

private IConfiguration _configuration;//创建字段,存放配置文件内容:appsettings.json
public Startup(IConfiguration configuration)
{
    _configuration = configuration;//自动获取配置文件appsettings.json里的内容。
}
//添加服务的:其实是loc依赖注入框架(管理我们的对象:有创建和自动释放的功能)这里配置所有地方都可以使用,外面就不需要在手动创建了
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();//添加Razo动态页服务组。
    services.AddDbContext<NetContext>(options => options.UseSqlServer(//添加数据库上下文类的一个服务
        _configuration.GetConnectionString("NetContext")));//配置文件里的数据库连接字符串。
}

最后两个命令就可以使用迁移将数据库运行起来了:1、add-migration init-Mig(生成迁移代码)2、update-database(执行到数据库)
显示数据库所有数据后台代码 index.cshtml.cs

using Microsoft.AspNetCore.Mvc.RazorPages;//必须引入页面模型pageModels的命名空间
using asp.net.Data;//上下文类,放连接数据库的
using asp.net.Models;//实体类,数据传输的

namespace asp.net.Pages;//命名空间可以不用大括号包裹

public class index: PageModel //后台代码必须继承PageModel页面模型
{
    private readonly NetContext db;//生成字段存放数据库上下文类的。

    public index(NetContext db) { this.db = db; } //配置了依赖注入,所有这里可以直接拿到上下文类
    //默认请求自动调用的两个方法:OnGet(get请求)与OnPost(post请求)
    public IEnumerable<Student> stu { get; set; } //创建可迭代类型对象

    public void OnGet() 
    {
        stu = db.Student.ToList();//查询到所有学生信息
    }
}

显示所有数据的前台代码 index.cshtml

@page
@model asp.net.Pages.index 
@{
     ViewBag.Title = "首页";
}

<p>显示学生信息</p>
<a asp-page="addstu">添加数据</a>
<table>
    <thead>
        <tr>
            <th scope="col">编号</th>
            <th scope="col">姓名</th>
            <th scope="col">性别</th>
            <th scope="col">年龄</th>
        </tr>
    </thead>
    <tbody>
        @if(Model.stu is not null)//直接包数据打印在网页上显示,是用Model对象
        {
            @foreach (var item in Model.stu)
            {
                <tr>
                    <th scope="@item.id">@item.id</th>
                    <th>@item.name</th>
                    <th>@item.sex</th>
                    <th>@item.age</th>
                </tr>
            }
        }
    </tbody>
</table>

@section jsName{
    <script>//子页js代码标签</script>
}

添加数据的后台代码 addstu.cshtml.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using asp.net.Data;//上下文类,放连接数据库的
using asp.net.Models;//实体类,数据传输的

using Microsoft.AspNetCore.Mvc.Razor;

namespace asp.net.Pages
{
    public class addstu : PageModel
    {
        private readonly NetContext db;

        public addstu(NetContext db) { this.db = db; }
        //默认请求自动调用的两个方法:OnGet(get请求)与OnPost(post请求)
        public void OnGet(){ }

        [BindProperty]//特性功能和页面绑定:页面写了什么,实体类数据就是什么。
        public Student? stu { get; set; }
        public IActionResult OnPost() 
        {
            if ((stu is not null) && ModelState.IsValid)
            { 
                db.Student.Add(stu);//添加到实体类
                db.SaveChanges();//保存到数据库
                return RedirectToPage("Index");//跳转首页
            }
            else 
            { 
                return Page(); //返回当前页
            }
        }
    }
}

添加数据的前台代码 addstu.cshtml

@page
@model asp.net.Pages.addstu
@{
    Layout = null; //或者 Layout =string.Empty;  
    ViewBag.Title = "添加学生信息";
}

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>@*ViewBag是试图对象,后面是变量,Title是c#给的自定义变量用显示网页标题*@
<body>
    <div>
        <h1>请输入学生信息,添加一跳数据</h1>
        <form method="post">
            <input asp-for="stu.name" placeholder="姓名" />
            <input asp-for="stu.sex" placeholder="性别" />
            <input asp-for="stu.age" placeholder="年龄" />
            <input type="submit" value="提交" />
        </form>
    </div>
</body>
</html>

 

posted @ 2022-11-11 07:20  Akai_啊凯  阅读(199)  评论(0编辑  收藏  举报