前言
在历史中,.Net分为派系,所以给开发者抬高了门槛儿;
往后:.Net6.Net7
.NET5对于我们开发者来说,其实没啥,因为他换的是底层基础架构;
如何升级
足够平滑,安装好.Net5的环境,直接修改框架版本即可;
C#6
- 只读自动属性
- using static
- Null 条件运算符
- 字符串内插
- 异常筛选器
- nameof 表达式
- 使用索引器初始化关联集合
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-6
C#7
- out 变量
- 元组
- 弃元
- 模式匹配
- ref 局部变量和返回结果
- 本地函数
- 更多的 expression-bodied 成员
- throw 表达式
- 通用的异步返回类型
- 数字文本语法改进
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7
C#8
- Readonly 成员 待处理
- 默认接口方法
- 模式匹配增强功能:
- Using 声明
- 静态本地函数
- 可处置的 ref 结构
- 可为空引用类型
- 异步流
- 异步可释放
- 索引和范围
- Null 合并赋值
- 非托管构造类型
- 嵌套表达式中的 14.Stackalloc
- 内插逐字字符串的增强功能
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8
C#9
1.记录
2.仅限 Init 的资源库
3.顶级语句
4.模式匹配增强功能
5.本机大小的整数
6.函数指针
7.禁止发出 localsinit 标志
8.目标类型的新表达式
9.静态匿名函数
10.目标类型的条件表达式
11.协变返回类型
12.扩展 GetEnumerator 支持 foreach 循环
13.Lambda 弃元参数
14.本地函数的属性
15.模块初始值设定项
16.分部方法的新功能
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9
Cshtml文件
Cshtml文件实则是一个Cs文件,类文件,可以支持前端后端语言的混编;通过Razor语法来实现前后端混编;
Razor语法
Razor 支持 c #,并使用 @ 符号从 HTML 转换为 c #。 Razor 计算 c # 表达式并在 HTML 输出中呈现。
当 @ 符号后跟 Razor 保留关键字时,它会转换为 Razor 特定标记。 否则会转换为纯 C#。
Razor表达式
1.隐式Razor表达式
2.显示Razor表达式
3.表达式编码
4.Razor代码块
5.本地函数声明
6.隐式转换
7.带分隔符的显式转换
8.显式行转换
Razor语法分支结构
@if, else if, else, and @switch
Razor组件
- Razor组件对应的类需要以ViewComponent结尾
- 继承ViewComponent类
- 定义一个异步版本的InvokeAsync 可以自定义参数
- InvokeAsync就是返回组件内容的方法
- 在Views文件夹下的Shard文件夹下建立Components 文件夹,再Conponents下创建一个和组件类名称相同的文件夹
- 创建视图
- @await Component.InvokeAsync(“List”, new { maxPriority = 123, isDone = false })调用组件
[ViewComponent(Name ="List")]
public class CustomListViewComponent: ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync(int maxPriority, bool isDone)
{
var items = await GetItemsAsync(maxPriority, isDone); //获取
return View("Richard", items);
}
private Task<List<TodoItem>> GetItemsAsync(int maxPriority, bool isDone)
{
return Task.Run<List<TodoItem>>(() =>
{
return new List<TodoItem>()
{
new TodoItem(){
Id=123
},
new TodoItem(){
Id=123
},
new TodoItem(){
Id=123
},
new TodoItem(){
Id=123
}
};
});
}
}
PartialPage
@await Html.PartialAsync("PartialPage", "这里是Html.Partial")
- 加载另一个页面的数据进行显示。
后台接收数据
/// <summary>
/// 接受页面提交的数据
/// </summary>
/// <returns></returns>
//[HttpPost] //只能是Post请求
[ValidateAntiForgeryToken] //验证当前页面上的Token是否符合
[AcceptVerbs("Post")]
public IActionResult Create([Bind("CategoryId", "Price", "Url", "ImageUrl")] JDCommodity commodity)
{
if (ModelState.IsValid) //支持实体验证---是验证是如何验证的?
{
{
//正常添加数据
}
return RedirectToAction("Query");//返回Query界面
}
else
{
ViewBag.categoryList = BuildCategoryList();
return View(commodity); //返回Create界面
}
}