.net5 core开发站点学习随笔
先说感觉,和以前区别还是很大。以vs2019创建可跨平台部署的ASP.NET Core Web项目为例,现在分成三种初始模式Razor、API、MVC(包含API)
以下面这个图示为例,区别就是Startup启动类里注入时5选1,注入下面哪个模式就按哪个模式开发
AddMvc,拥有所有功能,下面的功能都有。
AddControllersWithViews,MVC可以写api也可以用Razor语法,适合正常开发网站。
AddControllers,就是把MVC模式里的api这一块单独拿出来了,主要用于应对接口开发,比如小程序。因为api是没有页面的所以也没有session来验证用户,就需要用到比如JWT授权功能
AddRazorPages,算是强化的Razor,抛开了controller步骤,有点像当年的aspx,每个cshtml页面都有一个cs文件用来写代码,个人感觉应该是为了迎合小型网站的快速建设。
AddMvcCore,新建空项目就是这个,看描述应该不是给常规网站开发用的,感觉有点像给你点木板钉子,想要桌子还是凳子,自己去做去。
wwwroot,资源文件html,js,css,图片这些都装这里,只有放这里才能正常访问
appsettings.json,以前的什么config什么的都没了,现在只有这个配置文件,但功能也没以前那么多了,主要放点什么连接字符串,版本号什么的
微软提供了System.Text.Json来代替JsonNewtonsoft部分功能,比如常用的序列化和反序列化,但好像没有new JObject()这类方法。
<script src="~/js/site.js" asp-append-version="true"></script>应用自定义js文件时加上asp-append-version="true"属性,会生成一个随机码保证每次都会重新下载这个js防止更新后不下载
模板添加@await RenderSectionAsync("Scripts", required: false) 子页面使用@section Scripts{@*节点代码*@} 异步渲染自定义网页节点内容,看情况使用
启用session
1.ConfigureServices方法中
1.1 services.AddDistributedMemoryCache();//注册缓存
1.2 services.AddSession(options =>
{
options.Cookie.HttpOnly = true;
options.Cookie.Name = "myself.AdventureWorks.Session";
options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
options.IdleTimeout = TimeSpan.FromMinutes(20);
options.Cookie.IsEssential = true;//新设定必须启用
});//注册session
2.Configure方法中
2.1 app.UseAuthentication();app.UseAuthorization();app.UseSession();//启用身份验证、 授权、session
Ajax传Json到后台Action
百度查了半天,测试了一下午终于找到算是找到问题所在
public JsonResult MyAction([FromBody]Myclass data)比如说这个加[FromBody]声明就是一个百度出来最多的,但实际上data只会得到一个null
还有说必须在ajax中加contentType: "application/json; charset=utf-8",参数的,结果data只能得到一个对象,你传的数据根本没有填充进去
$.post("MyUrl",mydata);结果在我为了简化测试用了这么一句,代码public JsonResult MyAction(Myclass data),结果传进来了
也就是不是$.ajax不能传而是能不加的参数尽量别加,加了反而传不进去
唯一的问题就是josn里的key必须跟model的属性名必须完全一样,不然这个属性只会填充一个初始值比如0或者null
既然问题解决了,传对象也行传集合也行,只有你方法里这个参数类型结构跟这个json一致就能解析
写数据库的使用选用了开源的Dapper,然后遇到一个奇葩问题,就是返回查询多表的时候报错了,提示mysql语句有问题,然而我是在mysql那边写好确定能用复制过来的,百度了半天找到解决方案
查询方法需要用QueryMultiple,然后就是查询语句这里是重点!! @转义符号 + 每条查询语句之间必须换行,就这么奇葩
string strs = @"SELECT*FROM`t_one`;
SELECT*FROM`t_two`;";
通常我们设计后台权限使用的方案都是一级菜单->自定义层级菜单->显示页面的最底级菜单->页面上的功能,然后每个角色可以勾选不同的菜单使用权限和页面功能权限,在将角色绑定用户,用户登录后将用户角色保存在session中,每次请求页面或功能时通过筛选器判断该用户的角色是否包含当前请求的控制器和方法的使用权限,没有的话就返回错误信息或者跳转页面之类的操作
IApplicationBuilder的ApplicationServices方法获取的IServiceProvider对象是一个很多地方都要用的,通常我们可以通过构造函数注入的方式将一些预设对象传到方法里,但是并不是所有地方都可以这么传,比如异步方法。这时我们定义一个全局静态变量保存IServiceProvider对象,通过其CreateScope方法创建一个事物对象(用完记得释放),然后就可以通过GetService获取之前注入过的服务了。
使用EF框架的model代码快速生成命令的记得用NuGet命令行dotnet tool install --global dotnet-ef装工具包(默认安装最新版),安装错了可以先卸载dotnet tool uninstall --global dotnet-ef
在安装
appsettings.json配置文件中加
"Kestrel": { "EndPoints": { "Http": { "Url": "http://0.0.0.0:5000" } } }
可以启用IIS网站,手机端可以通过电脑的IP加端口号访问,用户手机端开发查看效果是否真实有效.
使用EF进行数据库查询,如果查询数据量极大,而且不会修改数据保存数据库,那么需要关掉EF的追踪功能
1.引用using Microsoft.EntityFrameworkCore;
2.关掉EF的追踪功,可以在查询是的时候关,比如DBContext.Model.AsNoTracking().ToList();
或者直接对DBContext对象进行设置整个过程都不进行追踪,比如DBContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
今天自己发布一个网站到IIS,然后显而易见直接报错,什么 web.config 不正确啦,结果完全不是这么回事。.netcore 和 之前的 .asp 发布已经不一样了,大人时代变了!那么我要手动改一下配置了,首先双击你发布的这个网站对应的【应用程序池】,点击【.NET CLR版本】选择【无托管代码】,【托管管道模式】选择【集成】,因为我们要让 .netcore 来接手,[https://dotnet.microsoft.com/download/dotnet],下载安装对应你的开发环境的 ASP.NET Core Runtime ,然后再 IIS-> 模块中就能看到【AspNetCoreModule】模块了,然后你就可以运行你的网站了。
以上是个人想法,不一定完全对