• .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:UsersAdministrator目录下

    2、改变数据库文件的位置(此步骤可略过,没成功),在VS2017的解决方案资源管理器中,在项目目录下新建一个db文件夹。t然后将C:UsersAdministrator目录下的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 BGSGXSQLEXPRESS -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.

     只好放弃了,等有机会更新服务器。

     

  • 相关阅读:
    Linux下Zookeeper安装使用
    Dubbo的@Reference和@Service说明
    java.lang.ClassNotFoundException: org.I0Itec.zkclient.IZkStateListener异常解决
    Java 开发常用工具
    Vue自动化路由(基于Vue-Router)开篇
    HTML5 开发APP( 支付宝支付)
    关于微信网页缓存的问题
    小程序(仿微信发布说说功能)
    移动端九宫格抽奖源码
    H5 + 开发App(分享功能)
  • 原文地址:https://www.cnblogs.com/pu369/p/9953896.html
Copyright © 2020-2023  润新知