.net core 2.1 Razor 超快速入门
以下过程如有不明白的,可参考:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/?view=aspnetcore-2.1
一、下载安装.net core 2.1和VS2017,开发环境配置好以后:
1、用cmd在某个目录下运行:
dotnet dev-certs https --trust
安装https证书后,再运行:
dotnet new razor -o razordemo
cd razordemo
dotnet run
漫长的等待后,根据提示访问:http://localhost:5000 会自动跳转到https://localhost:5001/
二、关闭cmd,用VS2017打开刚才创建的 razordemo.csproj。打开 Pages/Index.cshtml
1、将第4行,
ViewData["Title"] = "Home page";
改为
ViewData["Title"] = "主页";
保存,按F5, 你会看到 IIS Express出现在系统托盘上,IE被打开。IE标签显示为:主页
2、再修改为
ViewData["Title"] = "主页A";
按Ctrl + S 保存,直接刷新IE,IE标签变为:主页A
三、添加数据模型(我理解就是创建类,类的每个成员属性对应数据库表的列名)
1. 在解决方案资源管理器中,右键单击“razordemo”项目 >“添加” > “新建文件夹”。 将文件夹命名为“Models”。
2.右键单击“Models”文件夹。 选择“添加” > “类”。 将该类命名为 User 并将 User 内容替换为以下代码:
using System;
using System.ComponentModel.DataAnnotations.Schema; namespace razordemo.Models
{
public class User
{
public int ID { get; set; }
public string Name { get; set; }
}
}
四.搭建scaffold(我认为就是生成了对数据库操作的增删查改页面)
- 在解决方案资源管理器中,右键单击“Pages”文件夹 >“添加”>“新建文件夹”。
- 将文件夹命名为“Users”
在解决方案资源管理器中,右键单击“Pages/Users”文件夹 >“添加”>“新搭建基架的项目”。
在“添加基架”对话框中,选择“使用实体框架生成 Razor Pages (CRUD)”>“添加”。
- 在“模型类”下拉列表中,选择“User (razordemo.Models)。
- 在“数据上下文类”行中,选择 +(加号)并接受生成的名称“RazorPagesMovie.Models.RazorPagesMovieContext”。
- 选择“添加”。
将在Pages/User目录下生成一些文件。并自动更新了Startup.cs(通过依赖关系注入注册的上下文razordemoContext) 和 appsettings.json(添加ConnectionStrings)
并在Data目录下生成razordemoContext.cs文件,在其中为实体集创建 DbSet<User> User属性。实体集对应数据库中的表
五、添加初始迁移(我理解就是对照模型类,实际生成数据库及表,类似php的sql建表语句?)
1、打开cmd,转到项目文件夹下,使用以下 .NET Core CLI 命令
dotnet ef migrations add Initial
dotnet ef database update
漫长的等待命令完成。
打开VS2017-视图-SQL Server对象资源管理器。在其中可以找到razordemoContext数据库和User表。razordemoContext数据库属性中可找到数据文件的位置,我的是在C:\Users\Administrator\目录下
2、改变数据库文件的位置(此步骤可略过,没成功),在VS2017的解决方案资源管理器中,在项目目录下新建一个db文件夹。t然后将C:\Users\Administrator\目录下的mdf和ldf文件复制到刚才创建的db文件夹中(先在SQL Server对象资源管理器断开连接)。然后在SQL Server对象资源管理器中添加localdb.再到VS2017-视图-服务器资源管理器-添加数据连接,选择刚才的db文件夹中数据库文件。数据库文件移位成功。(如有不明白还可参考https://www.cnblogs.com/Traveller-Lee/archive/2016/08/16/5776312.html)
重新生成解决方案(不知道是不是个好习惯),再按F5,在打开的IE中,输入https://localhost:44369/Users/Create (注意:你的端口号可能不是44369),一个用于Create的页面出现了。添加一个User试试?杯具了,提示:SqlException: Cannot open database
参考https://www.cnblogs.com/mirrortom/p/5946817.html和https://technet.microsoft.com/zh-cn/hh510202 和 https://docs.microsoft.com/zh-cn/ef/#pivot=efcore 没解决。
删除数据库和连接,恢复原来的ConnectionStrings。重新dotnet ef migrations add Initial(可以将Initial改个名字)。提示已存在migration,才发现项目目录中有个Migrations文件夹。
重新 dotnet ef database update (可删除Migrations目录)
3、访问 https://localhost:44369/Users/Create (注意:你的端口号可能不是44369),成功。
六、设定数据库种子
在 Models 文件夹中创建一个名为 SeedData
的新类。 将生成的代码替换为以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection; namespace razordemo.Models
{
public static class SeedData
{
public static void Initialize(IServiceProvider serviceProvider)
{
using (var context = new razordemoContext(
serviceProvider.GetRequiredService<DbContextOptions<razordemoContext>>()))
{
// Look for any movies.
if (context.User.Any())
{
return; // DB has been seeded
} context.User.AddRange(
new User
{
Name = "张三"
}, new User
{
Name = "李四"
}, new User
{
Name = "李四"
}
);
context.SaveChanges();
}
}
}
}
在 Program.cs 中,修改 Main 方法
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using razordemo.Models; namespace razordemo
{
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider; try
{
var context = services.GetRequiredService<razordemoContext>();
context.Database.Migrate();
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
} host.Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
访问https://localhost:44369/users/ (注意:你的端口号可能不是44369) 可以看到添加的数据了。
七、更新生成的代码
1、打开 Models/User.cs 文件,修改为:
public class User
{
public int ID { get; set; }
[Display(Name = "姓名")]
[DataType(DataType.Text)]
public string Name { get; set; }
}
重新 F5 显示了汉字姓名
2、为User再增加一个属性 public int Ages { get; set; },然后执行
dotnet ef migrations add UpdateU
dotnet ef database update
这时从SQL Server对象资源管理器看,数据库表已更新 (注意:如果命令报错,可以检查是否把iis express退出。还可以重新搭建scaffold.
八、在项目的pages下新建一个页面名为My
在解决方案资源管理器中,目录Pages上点右键,添加Razor页面,名称为My
重新 F5 后,访问:https://localhost:44369/my
不关闭浏览器,直接修改My.cshtml中的 <h2>My</h2> 变为 <h2>我</h2> 然后刷新浏览器,My变成汉字了。其中的MyModel是在My.cshtml.cs中定义的。
九、使用 F7 在 Razor 页面和 PageModel 之间切换
上面的改My.cshtml就是Razor 页面,My.cshtml.cs就是 PageModel
- 选择“工具 > 选项 > 环境 > 键盘”
- 在“显示包含的命令”中输入 Razor
- 选择“EditorContextMenus.CodeWindow.ToggleRazorView”(编辑器上下文菜单代码窗口切换Razor视图)
- 在“按快捷键”输入框中,按 功能键 F7。
- 选择“分配 > 确定”
十、编写中间件
1、修改Startup.cs,在app.UseMvc();的上面加上
app.Run(async context => {
await context.Response.WriteAsync("Hello world");
});
现在访问任何路径都显示Hello world。测试完后删除上面的中间件代码。
2、自定义中间件
参考https://www.lisen.me/dotnetcore-use-custom-middleware.html
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.1
修改Startup.cs 如下,通过自定义中间件转到百度
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using razordemo.Models; namespace razordemo
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddDbContext<razordemoContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("razordemoContext")));
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
} app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
//调用中间件
app.SayHelloWorld();
app.UseMvc(); }
}
//定义中间件方法,重写Invoke
public class SayHelloWorldMiddleWare
{
private readonly RequestDelegate _next; public SayHelloWorldMiddleWare(RequestDelegate next)
{
_next = next;
} public Task Invoke(HttpContext context)
{
//context.Response.WriteAsync("Hello,World");
context.Response.Redirect("http://www.baidu.com");
return _next(context);
}
}
//扩展IApplicationBuilder
public static class SayHelloWorldMiddleWareExtensions
{
public static void SayHelloWorld(this IApplicationBuilder application)
{
application.UseMiddleware<SayHelloWorldMiddleWare>();
}
} }
测试完毕,删除以上代码。
十一、继续修改第八步的My页,给MyModel增加属性Message
1、为方便先修改Pages/Shared/_Layout.cshtml
将其中的 <li><a asp-page="/Contact">Contact</a></li>改为
<li><a asp-page="/Contact">Contact</a></li>
<li><a asp-page="/My">My</a></li>
2、参考https://blog.csdn.net/liyan530/article/details/77330162 和前面的Create页面和、seedData,
将My.cshtml.cs 修改为(也可写到My.cshtml中,见上面CSDN的参考)
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using razordemo.Models; namespace razordemo.Pages
{
public class MyModel : PageModel
{
public String Message { get; set; }
public void OnGet()
{
Message = "是来自Model的Message!"; }
}
}
将My.cshtml改为
@page
@model razordemo.Pages.MyModel
@{
ViewData["Title"] = "My";
} <h2>我</h2>
<h1>@Model.Message</h1>
然后F5运行程序(可选择使用Kestrel或IIS Express ),点击My链接,显示:我是来自Model的Message!
十二、数据库支持
1、sqlite 参考https://blog.csdn.net/wucdsg/article/details/78895366 和 http://www.cnblogs.com/hippieZhou/archive/2018/08/04/9420432.html
2、既然用微软的东东,就不用sqlite了,试试免费的Sql Server 2017 express吧
从这里下载 https://www.microsoft.com/zh-cn/sql-server/sql-server-editions-express
安装参考 https://jingyan.baidu.com/article/148a1921fe8f054d71c3b1cb.html
(我是安装在内网的一台服务器上的,很久没用了,一看已安装了IIS 并且以cgi方式支持了php,可参考 https://www.jb51.net/article/110784.htm
但服务器太老 server 2008的 sp2,只好将数据库换成了Microsoft® SQL Server® 2008 R2 SP2 - Express Edition 设置sa帐号密码为123456 )
安装完成后,找到sqlcmd (在osql上作了相当多的改进),执行sqlcmd -?
参考:https://blog.csdn.net/wwivywwivy/article/details/77370876 和 https://blog.csdn.net/dlycmsmoses/article/details/7457637
和 http://www.cnblogs.com/shanwater/p/6560702.html
sqlcmd -L 查询服务器名;
结果用sqlcmd又连不上服务器,提示没开远程,需要ssms,参考 https://blog.csdn.net/randomparty/article/details/79477887 下载SQL Server 2008 Management Studio Express 并安装
参考 https://www.cnblogs.com/weizhengLoveMayDay/p/3267756.html 进行配置(在进行配置前突然发现原来实例名写错了,应该是:sqlcmd -S BGSGX\SQLEXPRESS -U sa -P 123456)
配置中将SSCM中相关的ip1 ipall 都改成1433 动态端口清空,并在sscm中重启服务。再用sqlcmd -S 192.168.0.239 -U sa -P 123456 登录成功。
吐槽一下:微软的东东安装配置不是太费劲。
十三、在务器上发布razordemo项目
1、把服务器上旧网站端口改为8080,添加防火墙规则。
2、在IIS中新建一个网站,端口为80 物理路径为E:/razor
3、VS2017菜单 --生成-发布 发布到文件夹。将publish文件夹中的文件复制到服务器上的E:/razor中,在开发机上访问,失败。考虑到可能是数据库的问题。用VS2017重新生成了一个没有数据库的RAZOR项目,发布后,复制到服务器的IIS中,在服务器上的浏览器中进行访问,提示:错误:无法读取配置节"system.web.extensions",因为它缺少节声明
参考这里:https://blog.csdn.net/maxwoods/article/details/8723221 未解决。在服务器cmd中运行dotnet /? 失败。
又参考这里:https://jingyan.baidu.com/article/8ebacdf07d57f949f65cd5c7.html
安装 DotNetCore.2.1.6-WindowsHosting.exe (下载地址:https://www.microsoft.com/net/download)和 dotnet-sdk-2.1.403-win-x64.exe 结果装不上。
参考:https://blog.csdn.net/qq_27445903/article/details/78250897 和 https://blog.csdn.net/sD7O95O/article/details/78097329
其中有一句,注意事项: 服务器千万不要选择window server 2008 SP2 原来这个sp2就是vista ,老老旧了。又研究docker-windows 及老旧的Docker Toolbox,也不支持这个sp2.
只好放弃了,等有机会更新服务器。
.net core 2.1 Razor 超快速入门的更多相关文章
- IdentityServer4实现.Net Core API接口权限认证(快速入门)
什么是IdentityServer4 官方解释:IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现. 通俗 ...
- 【.NET Core】ASP.NET Core之IdentityServer4(1):快速入门
[.NET Core]ASP.NET Core之IdentityServer4 本文中的IdentityServer4基于上节的jenkins 进行docker自动化部署. 使用了MariaDB,EF ...
- Java中23种设计模式--超快速入门及举例代码
在网上看了一些设计模式的文章后,感觉还是印象不太深刻,决定好好记录记录. 原文地址:http://blog.csdn.net/doymm2008/article/details/13288067 注: ...
- IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问
IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问 原文:http://docs.identityserver.io/en/release/quickst ...
- ASP.NET Core 快速入门(Razor Pages + Entity Framework Core)
引子 自从 2009 年开始在博客园写文章,这是目前我写的最长的一篇文章了. 前前后后,我总共花了 5 天的时间,每天超过 3 小时不间断写作和代码调试.总共有 8 篇文章,每篇 5~6 个小结,总截 ...
- .NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...
- .NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
一.前言 本篇开发环境?1.操作系统:CentOS7(因为ken比较偏爱CentOS7)2.SDK版本:.NET Core 2.0 Preview 你可能需要的前置知识1.了解如何通过Hyper-V安 ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...
随机推荐
- 【Java每日一题】20170227
20170224问题解析请点击今日问题下方的“[Java每日一题]20170227”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...
- Netty实战十一之预置的ChannelHandler和编解码器
Netty为许多通用协议提供了编解码器和处理器,几乎可以开箱即用,这减少了你在那些相当繁琐的事务上本来会花费的时间与精力.我们将探讨这些工具以及它们所带来的好处,其中包括Netty对于SSL/TLS和 ...
- 深入源码分析SpringMVC底层原理(二)
原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...
- LNMP环境下安装Redis,以及php的redis扩展
1.下载 sudo wget http://download.redis.io/releases/redis-4.0.9.tar.gz 2.解压 sudo tar zvxf redis-4.0.9.t ...
- angular 拼接html 事件无效
主要是要引用$compile方法
- es6 语法 (类与对象)
{ // 基本定义和生成实例 class Parent{ constructor(name='mukewang'){ this.name=name; } } let v_parent1=new Par ...
- 教你分分钟搞定Docker私有仓库Registry
一.什么是Docker私有仓库Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候我们的服务器无法 ...
- SQL分组函数
分组函数是对表中的多行进行操作,而每组返回一个计算结果.常用的分组函数包括: 函数 语法格式 函数描述以及注意事项 AVG AVG([distinct|all] expr) 返回一个数字列或计算列的平 ...
- AWS专线服务总结和疑问
1.AWS专线服务的入口, 从介绍页上可以看到,有如下功能: (1)专线可以连接AWS云主机和传统的数据中心或者分支机构. (2)专线可以连接AWS云主机和托管区的主机. 连接要素: (1)需要使用V ...
- Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
一.深入JVM锁机制:synchronized synrhronized关键字简洁.清晰.语义明确,因此即使有了Lock接口,使用的还是非常广泛.其应用层的语义是可以把任何一个非null对象作为&qu ...