怀念夏天 发表于 2025-3-17 22:37:20

ASP.NET Webform和ASP.NET MVC 后台开发 大概80%常用技能

本文涉及ASP.NET Webform和ASP.NET MVC 后台开发大概80%技能
2019年以前对标 深圳22K左右  广州18K左右  武汉16K左右
那么有人问了2019年以后的呢? 答:祥瑞三宝。。。
So 想继承看下文的 得有本身的独立判定本领。
C#.NET高级笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文-CSDN博客
MySQL口试题 2024 金九银十 最新 C# 高级 资深 DB 八股文-CSDN博客
国产佳构ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一_sqlsuger进阶-CSDN博客
C#高级开发 线上口试题20240711_c# 开发高级口试题-CSDN博客
Redis高频口试题-CSDN博客
数据库SqlServer笔试题_sqlserver 笔试题-CSDN博客
WPF 2024 金九银十 最新 高级 架构 口试题 C#_wpf 口试题-CSDN博客
WPF UI交互专题 界面结构化处理 查察分析工具Snoopy 逻辑树与视觉树 平面图像 平面图形 几何图形 弧线 01_wpf逻辑树和视觉树代码-CSDN博客
C#.NET Core 笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文-CSDN博客_net core笔试题-CSDN博客
ASP.NET 框架技能
第一章C#语言新特性 
主动属性 
可空范例(可以为空的值范例) 
泛型类 
对象初始化器 
聚集初始化器 
var关键字 
匿名范例 
扩展方法 
匿名范例和Lambda表达式 
分部类 
第二章 Linq查询知识点详解 
Linq标准查询语法格式 
使用Linq进行数据查询的条件 
Where关键字 
Select关键字 
Count()方法 
Max()和Min() 
First()和FirstOrDefault() 
Average()方法 
Linq的团结查询 
Sum() 
OrderBy()和OrderByDescending() 
group by分组 
其他: 
第三章 Linq To Sql 
Linq及其扩展 
Linq To Sql简介 
Linq To Sql计划器 
DataContext数据库上下文类的常用属性和方法 
Linq To Sql常用操作 
新增数据 
修改数据 
删除数据 
数据查询 
典型应用场景 
场景1:服务器获取动态表单数据 
场景2:使用Linq To Sql进行分页 
场景3:在分层中如何使用Linq To Sql 
其他 
第一章ASP.NET MVC绪论 
MVC与ASP.NET MVC基础概念 
MVC三大组件的相互关系 
ASP.NET Webform模子和ASP.NET MVC模子的关系 
ASP.NET MVC中的约定 
其他 
ASP.NET MVC进阶一 
控制器相干 
视图相干 
其他 
ASP.NET MVC进阶二 
数据验证 
数据验证的步调 
常用的验证标记 
与验证相干的js文件 
验证相干的Html辅助方法 
在服务器端判定模子是否通过了验证(服务器端验证) 
Action与View的数据通报 
ViewData 
ViewBag 
TempData 
ActionResult的实现类 
ViewResult类 
ContentResult类 
RedirectToRouteResult类 
RedirectResult类 
JsonResult类 
PartialViewResult类 
FilePathResult类 
FileContentResult类 
FileStreamResult类 
EmptyResult类 
HttpStatusCodeResult类 
其他 
ASP.NET MVC进阶三 
ASP.NET MVC中的AJAX应用 
Ajax.ActionLink 
Ajax.BeginForm 
其他 
ASP.NET MVC进阶四 
ASP.NET MVC中使用母版页 
ASPX视图引擎的母版页功能 
Razor视图引擎 
Razor基本语法 
Razor视图引擎中母版页的用法 
Html.RenderSection() 
Razor视图中如何自定义辅助方法 
在ASP.NET MVC中如何实现模块化开发? 
ASP.NET MVC数据分页 
其他 
ASP.NET MVC进阶五 
重写Controller类的虚方法 
OnActionExecuting\OnActionExecuted 
OnResultExecuting\OnResultExecuted 
OnAuthorization 
OnException 
ASP.NET MVC中的过滤器 
IAuthorizationFilter 
IActionFilter 
IResultFilter 
IExceptionFilter 
ASP.NET MVC扩展案例 
1.ASP.NET MVC中使用富文本编辑器 
2.ASP.NET MVC中如何使用模态对话框 
3.ASP.NET MVC中如何实现通用弹框功能 
4.数据验证Remote的扩展应用: 
5.ASP.NET MVC中实现多文件上传 
6.ASP.NET MVC应用程序主动发布 
7.ASP.NET MVC中实现通用权限管理模块 

























第一章C#语言新特性

主动属性

下面两种写法作用相同.前者属于主动属性.在使用主动属性时应该注意:get和set访问器不能有具体的实现.
           https://i-blog.csdnimg.cn/direct/ed8a472f4c26414f8a61f65574ffff5a.png
           
可空范例(可以为空的值范例)

对于值范例而言,C#规定:在定义变量的同时必须要对其赋初值,否则可能无法通过编译器的编译.但是在某些环境下,用户事先是不知道变量的初始值是多少的.因为可以为空的值范例就显得很紧张.

[*]值范例包罗:int\double\float\decimal\bool\char
[*]可为空的语法为:Nullable<T>,此中T指代上面具体的某种值范例
比如,可以为空的int范例:Nullable<int>;可以为空的bool范例:Nullable<bool>

[*]可以为空的变量,在赋值时,可以将null赋值给它.
比方:Nullable<int>  age  =  null;

[*]Nullable<T>可以简写为:T?
比方: Nullable<int> age = null;等价于int? age = null;

[*]下面两种写法都是错误的.
string? name = null;  Student? Stu = null;
因为string和Student都是引用范例.

[*]可空值范例的常用属性:

[*]HasValue:布尔范例,如果字段不为null返回true,否则返回false.
[*]Value:获取字段的值,如果该字段的值为null,那么调用Value属性会报错
泛型类

List<T>:T可以指代任何范例,比如:int\bool\string\Student\...
Dictionary<T, K>:字典类,此中T和K可以指代任何范例
KeyValuePair<Tkey, Tvalue>:键值对范例
对象初始化器

使用对象初始化器,在实例化一个类对象的同时可以为它的属性赋值.
https://i-blog.csdnimg.cn/direct/f7e8c13f5afc4f4fbe4b9a8860a2b5a6.png

聚集初始化器

使用聚集初始化器,可以在实例化一个聚集对象时为它指定元素
https://i-blog.csdnimg.cn/direct/6d6d269e16f642a096eb9fbce46f3583.png

var关键字

var用于定义变量,变量的范例根据值来确定.
var  a  = 5; 因为5是int范例,以是a的范例也是int
var  stu  =  new  Student();因为通过new创建的是Student范例的变量,以是stu是Student范例.
注意1:var b;这种写法是错误的.原因是由var声明的变量,必须在定义的同时就赋初值.
注意2:通过var声明的变量一旦实例化后,就不能再更改它的数据范例.比方下面的代码:
var  a  =  5;  a  =  “zhangsan”;//a=”zhangsan”报错
匿名范例

在实例化一个类对象时,可以无须事先定义该类,通过new{}即可动态创建类对象.
https://i-blog.csdnimg.cn/direct/f8b2c2d6658f41d39ec7ea124c5dd1b4.png

扩展方法

扩展方法是指:为以前定义好的类扩展其他方法.具体步调如下:

[*]起首,定义一个静态类(类的名称没有限定)
[*]其次,在静态类中定义一个静态方法(方法返回值根据实际环境自定定义)
[*]末了,给上述静态方法添加一个参数,且该参数必须被this关键字修饰.
注意:  上面被this关键字修饰的参数的范例就是该扩展方法所扩展的范例
下面的代码演示了如作甚string类扩展名称为Convert的无参方法.
https://i-blog.csdnimg.cn/direct/2aad66c4027542c2a203a2adb003940a.png

匿名范例和Lambda表达式


[*]什么是委托:委托允许将一个方法作为参数,通报给另外一个方法.
下面的代码演示了如果使用委托计算2个数字的加法\减法\乘法.
委托和挂载的方法:参数个数\参数范例\参数序次\返回值范例必须要同等.https://i-blog.csdnimg.cn/direct/344dd992930741c592744ecfa90405cc.png

[*]但是上述方式,使用很复杂.我们可以通过匿名方法来简写上述功能.=符号右侧的就是匿名方法.https://i-blog.csdnimg.cn/direct/d9054cafff734ea78d8f7ddd7b7fad0c.png

[*]Lambda表达式也是匿名方法的一种.并且它的语法更加轻便明了.
Lambda表达式分3部分  :   参数   |   =>   |    表达式
下面的代码演示了如果使用Lambda表达式改写委托的示例.此中3个粉色的线框就是Lambda的3部分.
https://i-blog.csdnimg.cn/direct/4615b394538d476290925bc140266666.png
注意1:如果Lambda表达式只有1个参数,那么参数部分可以不用()包裹
注意2:Lambda表达式部分可以使用{}包裹,也可以不包裹.如果有多行代码,必须要使用{}包裹起来.

[*]在出现委托(Func参数)的地方,我们就可以写Lambda表达式.
Func<T, K>是一个泛型委托.该委托的参数范例为T,返回值范例为K.
https://i-blog.csdnimg.cn/direct/fff5aaa3c8da4be0bc279f1be67ac39f.png
Lambda表达式的参数arg的范例为T,Lambda的表达式部分返回值范例为K.
分部类

分部类允许将一个类的定义拆分到多个文件中.Winform应用程序和ASP.NET Webform应用程序中的每一个窗体所对应的后台类就采用了分部类技能.
分部类的语法就是:在类声明时,在关键字class前添加partial关键字.
下面的代码将名称为Person的类拆分到了2个类文件中,分别是:Person.cs文件和PersonExt.cs文件.
  https://i-blog.csdnimg.cn/direct/bccb6ee1746940408016e953482237d5.png














第二章 Linq查询知识点详解

Linq标准查询语法格式

var data = from  变量  in  聚集对象 
            where  布尔表达式
     orderby  排序字段  descending|ascending
            select  变量;
解释:
select:提取要查询的数据                 where:筛选满足条件的元素   
from 变量:该变量指代聚会合的单个元素   in:从哪里筛选元素
orderby:排序                          descending:降序  ascending:升序
注意:where是可选的,如果不加where则表现筛选所有元素.
示例代码:
https://i-blog.csdnimg.cn/direct/54d9b55218994a8eb7bbe2defcb349cd.png

使用Linq进行数据查询的条件

数据源(in 后面的聚集对象)必须直接或间接继承自IEnumerable<T>
或者说:只要数据源继承自IEnumerable<T>,我们就可以使用Linq从它里面检索数据
Where关键字

筛选满足条件的元素,where关键字后面肯定要跟布尔表达式
Where后面的布尔表达式可以很简单,也可以是复杂的表达式.
注意:
注意from关键字后面可以出现多个where表达式,这些表达式之间是并且的关系
https://i-blog.csdnimg.cn/direct/802bdec622aa4feca583ac82a6269d6e.png

Select关键字

Select关键字用于提取要查询的数据.
Select后面可以直接跟from后面的变量;也可以跟一个匿名范例.
https://i-blog.csdnimg.cn/direct/df56b49a21574f0ca2c5a1fa11d08e81.png
Count()方法
Count(expression<Func<T, bool>>)
解释:T代表Lambda表达式中的参数部分,bool代表Lambda表达式部分为布尔范例
Count方法用于获取满足条件的记录数量(有多少个满足条件的记录)
https://i-blog.csdnimg.cn/direct/84e43b8fabeb41aeb24f53a241e32f8b.png

Max()和Min()

Max(Expression<Func<T, K>>)和Min(Expression<Func<T, K>>)
Max:求最大值    Min:求最小值
https://i-blog.csdnimg.cn/direct/6da8a61c7bb44f2da5edb3dddf03fb3b.png
First()和FirstOrDefault()

First(Expression<Func<T, bool>>)
FirstOrDefault(Expression<Func<T, bool>>)
两个方法都是从聚会合筛选满足条件的第一个元素.
区别:当没有从聚会合筛选到满足的条件的元素时,First将会报错,FirstOrDefault则不会报错.
https://i-blog.csdnimg.cn/direct/ddb5607a00bc4160a2143b6773d23d32.png
Average()方法

该方法用于计算平均值
https://i-blog.csdnimg.cn/direct/0d7f5b90c7fb4e93b255d00681920ca2.png

Linq的团结查询

将两个聚集进行关联,然后从这两个聚会合提取所需要的数据.
语法格式:
var  data  =  from  变量1  in  聚集1
               from  变量2  in  聚集2
               where  变量1.属性  ==  变量2.属性
               select  new { ...  ...}
提示:可以将N个聚集进行关联(N>=2)
示例代码:
https://i-blog.csdnimg.cn/direct/a312a7a8b86c4fde99455b5e61c3c453.png

Sum()

Sum(Func<T, K>)
此中T为参数的范例,K为返回值的范例.
Sum()方法用于对数据进行求和运算.
https://i-blog.csdnimg.cn/direct/7a0f3e32ddee4dbe86bdbdd57de47da0.png
OrderBy()和OrderByDescending()

这两个方法用于实现对数据进行排序(升序和降序)
https://i-blog.csdnimg.cn/direct/aea02a43b1634ef3bf18a1d5530c05aa.png
group by分组

分组的标准语法:
var  data  =  from  变量1  in  聚集对象
               group  变量1  by  变量1.属性  into  变量2
               select  变量2;
注意:使用group by分组后,将不能使用之前的变量1,需要通过into关键字定义一个新的变量2.新的变量指代的是分组后的每一组.
关于分组的示例
https://i-blog.csdnimg.cn/direct/7ee16434f0fd4eed9af37540dcfd39cb.png
其他:



[*]在进行数据查询时,.net framework为我们提供了2套方案:
一种是使用标准的linq查询语法=>
(from\in\select\where\orderby\ascdening\descending\group\by\into\join);
另一种方案是使用扩展方法=>
(Where\Select\FirstOrDefault\Count\Sum\Average\Max\Min\OrderBy\OrderByDescending\GroupBy\Last\LastOrDefault)
当然,我们也可以将2种肴杂起来使用.


[*]其他常用扩展方法
Intersect:取两个聚集的交集             Union:取两个聚集的并集
Except:去两个聚集的差集                 Reverse:反转序列中元素的序次
ForEach:遍历聚会合的元素
第三章 Linq To Sql

Linq及其扩展

Linq是一种数据查询语言(它可以大概从多种数据源中查询数据). 现在基于Linq的扩展有:

[*]Linq To Object:重要是从内存对象中查询数据
[*]Linq To Sql:重要是从MS Sql Server数据库中利用(查询\新增\修改\删除)数据
[*]Linq To XML:重要是从XML片段或XML文档中查询数据
Linq To Sql简介

Linq To Sql是一个微软在.NET Framework 3.5中推出的一款ORM(Object  Relation  Model)实体框架.一个好的实体框架除了可以大概将数据表映射为实体类,还应该支持使用面向的思想去利用关系型数据库.现在比较流行的ORM框架包罗:Linq To Sql\Entity Framework\Nhibernate等.
我们在使用Linq To Sql的过程中,很少去手写SQL语句就能实现常见的数据增编削差操作.但是它的底层实现仍然是Ado.net.那么如何检测Linq To Sql生成的SQL语句呢?通过DataContext的Log属性即可实现检测功能.
https://i-blog.csdnimg.cn/direct/3f90123c70ae4ed891c6c01293e345ea.png
Linq To Sql计划器

在服务器资源管理器中通过拖拽的方式,将数据表放置到Linq To Sql的计划器地区后,VS会主动将这些数据表生成N+1(N为数据表的个数)个类.这些类大致可以分为2种:一种是数据库上下文,另一种是实体类.数据库上下文类就是名称以DataContext末端的类,它继承自Sytem.Data.Linq.DataContext.
他们的作用分别是:DataContext类用于和数据库交互(增编削查),每次进行数据库操作时,都应该先创建该类对象;
而每一个实体类则和数据表相对应.
DataContext的特性标记为Database,表现与数据库相干
https://i-blog.csdnimg.cn/direct/e352e1efc05a4c78a2f8ec57293a5742.png
实体类的特性标记是Table,表现与数据表相干
https://i-blog.csdnimg.cn/direct/704e1dc521f647babe21007527434dc2.png
实体类中属性的特性标记是Column,表现与数据列相干
https://i-blog.csdnimg.cn/direct/7731621e6afb479cb514acf22d52924b.png

DataContext数据库上下文类的常用属性和方法

CreateDatabase():创建数据库
DeleteDatabase():删除数据库
DatabaseExits():判定数据库是否存在
Log:该属性用于检测和写入LINQ TO SQL生成的SQL语句
Linq To Sql常用操作

新增数据

void  InsertOnSubmit():实现每次新增1条记录
void  InsertAllOnSubmit():实现一次新增多条记录
注意:调用InsertOnSubmit后,肯定要再调用DataContext.SubmitChanges();
https://i-blog.csdnimg.cn/direct/68e5bd9bd39a4fe7861a6d7abad135f8.png
修改数据

起首,查询到要修改的元素
其次,改变元素相应的属性
末了,调用dataContext.SubmitChanges()
https://i-blog.csdnimg.cn/direct/c8da71db566e442f942664d4493c3291.png
删除数据

起首,查询到要删除的元素
其次,调用void DeleteOnSubmit()删除单个元素,如果要删除多个可以调用void DelteAllOnSubmit()
末了,调用dataContext.SubmitChanges();
https://i-blog.csdnimg.cn/direct/49c41ce69c8249e29bb155af3b636f7c.png
数据查询

数据查询时,有2种常用的使用方式.一种是使用linq的标准语法;一种是使用Lambda表达式扩展方法.
单表查询:

https://i-blog.csdnimg.cn/direct/34b40702b5d846c4864274b282bf86c3.png
多表查询:

https://i-blog.csdnimg.cn/direct/8b727102aa114545936d740f00eb48b7.png
典型应用场景

场景1:服务器获取动态表单数据

https://i-blog.csdnimg.cn/direct/0e42c088ebfb4ba3a267fab64d6a7b09.png
做法一:
https://i-blog.csdnimg.cn/direct/9ca5124c8b40482790b511e93aca0655.png
做法二:
https://i-blog.csdnimg.cn/direct/0f75df571fcb4608b0cf30e32a0778ce.png
上述两种做法都可以实现功能.做法一是先实现工资模版的新增,然后再新增工资条目.做法二是向工资模版对象中添加多个工资条目,然后向数据库提交工资模版.
需要注意的是,做法一中为工资条目对象设置了工资模版ID,而做法二并没有为工资条目设置工资模版ID.但为什么末了效果却是一样的呢?
因为我们将工资条目添加到工资模版对象中时,linq to sql会主动将主外键关系的字段赋值.
场景2:使用Linq To Sql进行分页

分页功能需要使用两个函数进行组合:Skip()和Take()
Skip(int count):跳过count条数据
Take(int count):从开始位置提取count条记录
分页查询: dataContext.XXX.Skip(pageIndex * pageSize).Take(pageSize)
pageIndex是要提取的第几页记录.pageIndex >= 0
pageSize是每页显示的记录条数
场景3:在分层中如何使用Linq To Sql

Linq To Sql是ADO.NET的一种更换方案,而ADO.NET属于数据层的范畴,因此应该将Linq To Sql添加到数据层.又因为Linq To Sql生成的类既包罗了DataContext,又包罗了实体类,以是如果要使用Linq To Sql生成的实体类,就需要将这些实体类剪切到实体层中,然后在向DataContext中添加实体层的引用即可.
当然,我们也可以不将Linq To Sql生成的实体类剪切到实体层中,那么这样我们就需要额外重新编写实体层需要的实体类.
其他



[*]EntitySet<T>:该类表现数据实体的聚集
[*]System.Data.Linq.Table<T>:该类表现数据表对象
[*]如何判定通过Linq To Sql进行数据的修改\删除\新增是否乐成?
因为InsertOnSubmit方法和DataContext.SubmitChanges()方法都没有任何返回值,以是无法通过他们判定出是否操作乐成.判定的标准就是:如果不抛出异常就乐成,抛出异常肯定就失败了.


[*]对于标识列(主动生成列)而言,在调用DataContext.XXX.InsertOnSubmit()后是无法获取标识列的值的;只有在调用DataContext.SubmitChanges()后方能获取标识列的值.
[*]在项目中,我们可以使用VS提供的Linq To Sql计划器,快速的生成DataContext和实体类.也可以手写相应的类代码.在这里推荐大家使用VS提供的Linq To Sql计划器,因为它更加方便快捷,基本都是通过拖拽的方式就实现我们想要的效果.除非计划器生成的代码不满足你的要求,我们才会采用第二种方案.





















第一章ASP.NET MVC绪论

MVC与ASP.NET MVC基础概念

MVC是Model-View-Controller的缩写.
MVC将应用程序划分为3大组件:模子\视图\控制器.
MVC不是ASP.NET所特有,它只是一种开发理念.java中的struts2也是一种MVC模子.
ASP.NET MVC从2008年发布1.0版以来,停止2014年ASP.NET MVC最新版本已经是5.0.
ASP.NET MVC从1.0版开始,就已经开放源代码(源码所在:aspnetwebstack.codeplex.com).
ASP.NET MVC官网所在:http://www.asp.net/mvc
ASP.NET MVC 模式 | .NET
MVC三大组件的相互关系



[*]在控制器中可以直接调用视图和模子
[*]在视图中可以调用模子.
[*]模子不能调用视图
[*]模子可以大概限定视图中使用的数据,但视图中使用的模子应由控制器提供
[*]在视图中可以调用控制器(通过视图中表单的提交和点击超链接的方式调用)
https://i-blog.csdnimg.cn/direct/6dda8a8b26484f3984cdcf3d00f2f903.png

ASP.NET Webform模子和ASP.NET MVC模子的关系

二者都是基于ASP.NET Web框架构建的开发模子.以是ASP.NET中的一些功能可以被二者公用.
Webform编程模子是典型的以事件驱动的web模子,而MVC则不是.
Webform的URL所在是基于文件体系的,而MVC则是基于Action.
https://i-blog.csdnimg.cn/direct/d029f870af784cd4b1b184f940aaf904.png


ASP.NET MVC中的约定



[*]所有的控制器必须放到Controllers文件夹下
[*]所有的控制器类名必须以Controller末端
[*]所有的模子应该放到Models目录下
[*]所有的视图文件都应该放到Views目录下.
[*]所有的控制器类都应该继承自Controller类(本质上是要继承Icontroller接口)
[*]在控制器类中的public方法被成为Action(行为)
[*]如果在相应的视图目录中没有找到视图文件,那么会寻找Views\Shared目录下名称相同的视图文件
[*]在Action中return view(),默认会返回和Action名称一样的视图文件.
[*]在Global.asax全局应用程序类中注册了默认路由(名称为Default),默认路由指定了Controller默认为Home,Action默认为Index,参数id为可选参数.以是在URL所在中如果不输入controller默认访问Home控制器;如果不输入action默认访问名称为Index的action.


[*]http://localhost:54321/   解释:
根据默认路由规则,等价于 => http://localhost:54321/Home/Index


[*]http://localhost:54321/Home/Index/5  解释:
数值5会主动映射到action中名称为id的参数中。


[*]Http://localhost:54321/Home/Index/5?name=jack&age=20   解释:
此中参数包罗id、name和age三个
其他

在视图文件中,有一个名称为Model属性,它指代的是从Action中通报的模子数据.为了使用模子数据,我们还需要在<%@Page  %>指令的Inherits属性中设置模子数据的范例.
























ASP.NET MVC进阶一

控制器相干



[*]在Controller类中方法访问级别为public的方法,就是行为(Action).
[*]如果不希望Controller类中的方法成为Action(可以在所在栏中被访问),有两种实现方式:

[*]将方法的访问级别设置为private
[*]在方法上添加特性标记
https://i-blog.csdnimg.cn/direct/4d924cc385d741deaeea0fcff78fa542.png


[*]诸如新增\修改等功能模块,我们每每会创建2个名称相同的Action:一个action用于加载新增\修改页面;另一个action用于处理新增\修改页面提交的表单数据.那么如何区分在何时调用哪个action呢?
我们将加载新增|修改页面时被调用的action,添加特性标记;将处理页面提交的表单数据时调用的action,添加特性标记.
下面的示例代码演示了如何实现门生的新增(action相干的代码).
https://i-blog.csdnimg.cn/direct/03745cd602614af0886e69e83cd42302.png


[*]如安在Action中获取表单提交的数据?
表单中提交的数据,可以通过Action的参数进行映射.
映射的前提条件:Html标记的name属性值和action中参数的名称要同等.
下面的示例代码演示了映射的过程(注意粉色框标记的部分):
https://i-blog.csdnimg.cn/direct/f13ca39d326841e6bd2ee0d878f6d102.png


[*]Action中如何映射复杂对象?
对于上面的映射代码,我们还可以有另外一种等价的写法,就是将映射的属性定义到一个实体类中,这样我们就可以在action中添加该实体范例的参数,参考代码如下所示:
https://i-blog.csdnimg.cn/direct/524788e42fbc4ab280f9af8bb0171520.png


[*]如何从一个Action中跳转至另外一个Action?
新增或修改功能完成后,需要跳转至数据列表页面,我们可以通过如下代码实现:
代码 => return RedirectToAction(“ActionName”, “ControllerName”).
视图相干



[*]在ASPX视图引擎中,可以使用asp服务器控件,但它的作用仅仅范围与生成html代码,而不推荐开发人员使用asp控件的事件.因此发起开发人员手工编写Html标记。
但是手写Html标记比较淹灭时间,有没有更好的解决方案?答案就是使用Html辅助方法。


[*]Html辅助方法
Html辅助方法的作用就是通过调用C#方法的方式,快速的生成相应的html标记.
Html辅助方法分为2大类:弱范例html辅助方法和强范例html辅助方法.
此中以For关键字末端的都是强范例的辅助方法.下面的示例代码演示了二者的调用方式,以及生成的html源码。
https://i-blog.csdnimg.cn/direct/e0ec9ede11424c4e93a2da6e89a9165f.png
https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5CADMINI~1%5CAppData%5CLocal%5CTemp%5Cksohtml6388%5Cwps45.jpg&pos_id=o4PUvrHb
注意:Html辅助方法有很多种重载情势,在开发过程中可以根据实际需要自行选择.比如要实现一个包含class\style\onchange属性和事件的单行文本框,可以参考如下代码:
https://i-blog.csdnimg.cn/direct/846d6848a02c4f82aab9c6a58484dd36.png
夸大:如何使用HTML辅助方法生成form标记?
生成form标记的两个Html辅助方法为:Html.BeginForm()和Html.EndForm(),但他们在使用时和其他的Html辅助方法有所不同,下面的示例代码演示了它们的两种用法:
https://i-blog.csdnimg.cn/direct/9af4949eca074595935556b4df11f879.png


[*]如安在URL所在中通报参数?
场景一:将门生ID值映射到名称为id参数上
场景二:将门生ID值映射到名称为stuId参数上
场景三:url所在中包罗stuId和name两个参数
这三种场景的使用代码如下所示:
https://i-blog.csdnimg.cn/direct/a473ce4fda834881a724ec4e23c8c2eb.png


其他



[*]在实际开发过程中,一个小的功能模块就对应一个控制器.比如门生信息管理就是一个控制器,新增门生\修改门生\查询门生列表\删除门生都可以对应控制器中的Action.
[*]常用Html辅助方法汇总

弱范例
强范例
单行文本框
Html.TextBox()
Html.TextBoxFor()
多行文本框
Html.TextArea()
Html.TextAreaFor()
密码框
Html.Password()
Html.PasswordFor()
复选框
Html.Checkbox()
Html.CheckBoxFor()
单选按钮
Html.RadioButton()
Html.RadioButtonFor()
下拉列表框
Html.DropdownList()
Html.DropdownListFor()
平铺列表框
Html.ListBox()
Html.ListBoxFor()
Label
Html.Label()
Html.LabelFor()
Form表单
Html.BeginForm()     Html.EndForm()
超链接
Html.ActionLink()



[*]如安在视图中使用下拉列表
第一步:在action中构造好下拉列表中需要的数据,数据的范例为IEnumerable<SelectListItem>。
第二步:将构造好的数据放到Controller中的ViewData(ViewBag|TempData)属性中。
第三步:在视图view中使用Html.DropDownList辅助方法来生成下拉列表,而绑定的数据可以使用视图View中的ViewData来获取(换句话讲就是,Controller中放置到ViewData的数据,可以在视图View中的ViewData属性中提取)。
https://i-blog.csdnimg.cn/direct/4eaf946aa2a04223b05beb0bde39be18.png
在视图中使用Html.DropDownList绑定Ienumerable<SelectListItem>
https://i-blog.csdnimg.cn/direct/816752a53e4c465c9bb8c195b7de12a5.png


ASP.NET MVC进阶二

数据验证

数据验证的步调


[*]
[*]
[*]
[*]在模子类中添加与验证相干的特性标记
[*]在客户端导入与验证相干的js文件和css文件
[*]使用与验证相干的Html辅助方法
[*]在服务器端判定是否通过服务器端验证



常用的验证标记

https://i-blog.csdnimg.cn/direct/78ae6d89e33d4f669f7bfe2a77d6c2cf.png


[*]Required:非空验证
[*]StringLength:验证字符串的长度
[*]RegularExpression:正则表达式验证
[*]Compare:比较两个字段的值是否相称
[*]Range:范围验证
[*]Remote:服务器验证(需要在controller中编写返回值为JsonResult的Action)
[*]自定义验证标记
与验证相干的js文件

在ASP.NET MVC中提供了2套验证框架,分别是微软验证框架和jquery验证框架.默认启用了jquery验证框架.
注意:这些js文件的序次不能颠倒;此中Site.css文件中定义了数据验证使用的样式.
https://i-blog.csdnimg.cn/direct/b8dc79fcd57246558dd71aa0187aba7b.png
验证相干的Html辅助方法

注意:1.必须使用Html.ValidationMessage()和Html.ValidationMessageFor()来显示验证失效的提示信息;
2.被验证的控件(如文本框\下拉列表框等)必须使用Html辅助方法生成才有用.
https://i-blog.csdnimg.cn/direct/268f3205190940d6a3ab3e74a97bc313.png
在服务器端判定模子是否通过了验证(服务器端验证)

页面中如果使用了MVC验证功能,那么在后台对应的Action中必须通过ModelState.IsValid判定是否通过了服务器端验证。只有通过了服务器端验证,才能实行其他的业务逻辑代码。
https://i-blog.csdnimg.cn/direct/7cf2e2ef2be2488e83c15db6bba83db9.png
使用要点:

[*]被验证的标记不能是纯html,必须使用相应的html辅助方法
比方:Html.TextBoxFor(model=>model.UserName),则验证有用;
     <input type=”text” id=”UserName” name=”UserName” />,则验证无效;

[*]必须使用相应的html辅助方法显示验证消息(Html.ValidationMessage)
[*]被验证的控件必须放在有html.beginform的辅助方法内部(不能是纯<form>标记).
[*]客户端验证是不安全的,轻易被禁用或诱骗,以是肯定要在服务器端判定ModelState.IsValid是否为true.
Action与View的数据通报

在某些环境下,视图需要显示多份数据(比如被修改的员工信息\岗位列表\部分列表),但是Action在返回视图时,View()方法只能通报1个object范例的数据,那么其他的数据该如何通报?
ASP.NET MVC为我们提供了3种方案:ViewData\TempData\ViewBag.
紧张提示:在Controller和View中都有这三个属性,在Controller的相应属性中存放了数据后,就可以在View的相应属性中提取这些数据。
ViewData

ViewData是一个字典范例.向里面添加数据时要以键值对的情势添加.
起首在Action中向ViewData中添加,其次就可以在View中访问ViewData来提取数据.
https://i-blog.csdnimg.cn/direct/00c7fcfad2a34faabde4b96ce5e017cd.png
ViewBag

ViewBag是一个动态范例的属性。在ASP.NET MVC 3.0中才到场了ViewBag属性.
动态范例:dynamic,就是可以事先不为其定义属性,通过直接给属性赋值的方式就可以随时为它添加新的属性.
下面的代码演示了向ViewBag中存放cls和stu两个对象,这两个对象分别放到了属性ClassInfo和StudentInfo中。
https://i-blog.csdnimg.cn/direct/04b34e0760a14b48b1119764c661f8f7.png
TempData

TempData的用法和ViewData很相似,都是字典范例.那他们的区别是什么?
ViewData中存储的数据仅仅对本次访问的当前action有用.而TempData中存储的数据,除了对本次访问的当前action有用外,还对本次访问的其他action有用(比如在Action1中向TempData中存放了数据,即使从Action1跳转至Action2后,仍然可以在Action2中从TempData提取数据。而ViewData和ViewBag都无法做到这一点).因此,TempData中数据的生命周期比ViewData|ViewBag中的生命周期要长.
ActionResult的实现类

在ASP.NET MVC模子中,Action用于响应用户的各种哀求,比如向客户端返回html文档、html片段、json数据、纯文本、文件等效果。在ASP.NET MVC中通过在Action(行为或操作)方法中返回ActionResult范例的对象来实现向客户端响应上面的各种效果。
ActionResult类是个抽象类(抽象类无法直接被实例化).
ActionResult有很多实现类,不同的实现类用于响应客户端不同的效果。并且在Controller类中提供了大量的辅助方法,这些辅助方法可以快速的创建各种ActionResult.
在实际开发中,我们更多的是使用Controller类中的辅助方法,而非本技艺工创建ActionResult的实现类。
ViewResult类

ViewResult类的作用是向客户端响应View目录中一个视图文件.
Controller类中提供了View()方法,来快速的返回一个ViewResult类对象.
ContentResult类

该类用于向客户端返回一段文本内容(纯文本\HTML...).
在Controller类中的辅助方法为:Controller.Content(string  content);
https://i-blog.csdnimg.cn/direct/c2fb63ef05684de991a6207c4a2dacf4.png
RedirectToRouteResult类

该类的作用是从当前action跳转至其他action.
在Controller类中的辅助方法为:RedirectToAction(“ActionName”, “ControllerName”)
RedirectResult类

在服务器端从当前Action跳转到其他URL所在.
在Controller类中的辅助方法为:Controller.Redirect(string  url)
https://i-blog.csdnimg.cn/direct/29a387be7f0c42db8bb652ab6001d672.png
JsonResult类

该类用于向客户端返回一段Json格式的字符串.
在Controller类中的辅助方法为:Controller.Json(object  data);
注意:默认环境下mvc拒绝响应以get方式发送的ajax哀求,需要使用JsonRequestBehavior.AllowGet。
https://i-blog.csdnimg.cn/direct/7f2ce6c6b8264022bac54e68a8ca7f2c.png
PartialViewResult类

该类的作用是向客户端响应Views目录的一个分部视图文件。分部视图就是只包含html片段的视图文件.
在Controller类中的辅助方法为:Controller.PartialView();
https://i-blog.csdnimg.cn/direct/c1f931c6710f4f3f9e3967d0256dc6ab.png
下图演示了在创建视图文件时,如何创建一个分部视图文件(勾选“创建为分部视图”复选框):
https://i-blog.csdnimg.cn/direct/f7369be515a54adb8712912a983c1088.png
FilePathResult类

该类用于实现文件下载.
在Controller类中的辅助方法为:Controller.File(string  filePath,  string  contentType, string  fileName);
https://i-blog.csdnimg.cn/direct/bb7d90c104634382b6450d11b2093849.png
FileContentResult类


FileStreamResult类


EmptyResult类

该类用于向客户端响应一个空效果。
HttpStatusCodeResult类

该类用于向客户端相应指定的状态码.
HttpNotFoundResult类就是HttpStatusCodeResult的子类,表现404这一状态码。
下面的是一些常用的http状态码:
404:资源未找到(表现客户端哀求服务器的资源所在不存在)
500:服务器内部错误(以5XX开头的表现服务器端在处理过程中出现的错误)
200:乐成(表现客户端发送的哀求被服务器乐成的处理和响应)
其他

如安在aspx页面中导入定名空间?
方式一:在指定的页面添加<%@ Import Namespace=”定名空间” %>
https://i-blog.csdnimg.cn/direct/a76a5f6310e54a9fad5334e2f8a7b906.png
方式二:在项目的web.config配置文件中添加pages---namespaces----add
https://i-blog.csdnimg.cn/direct/e832d314429a4e2d9466be7c907c5851.png
通过方式二添加的定名空间可以在所有的aspx页面中使用;而方式一添加的定名空间只能在当前页面中使用.







ASP.NET MVC进阶三

ASP.NET MVC中的AJAX应用

起首,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(序次不能颠倒):
https://i-blog.csdnimg.cn/direct/f720eaf9d88744d39ba02623dbcea686.png
ASP.NET MVC提供了2个常用的ajax辅助方法.
Ajax.ActionLink

该辅助方法用于在页面上生成具有ajax功能的超链接.
https://i-blog.csdnimg.cn/direct/e4e2042bc65d478ba5622d274025deaf.png
在该辅助方法中有一个AjaxOptions范例的参数,它包罗如部属性:


[*]Confirm:在发送ajax哀求前,弹出确认对话框,该属性就是设置对话框中的提示消息
[*]HttpMethod:用于设置哀求的范例:Get|Post
[*]UpdateTargetId:用于设置服务器响应的效果更新到页面中目的元素ID
[*]InsertionMode:用于设置服务器相应的效果如何插入到被更新的元素中,它的值可以包罗3种: 
InsertionMode.Replace:用新值更换旧值(默认值)
InsertionMode.InsertAfter:将新值插入到目的元素的底部
InsertionMode.InsertBefore:将新值插入到目的元素的顶部


[*]OnBegin:当实行ajax哀求前,实行的js函数
[*]OnSuccess:当实行ajax哀求乐成时,实行的js函数
[*]OnFailure:当ajax哀求失败时,实行的js函数
[*]OnComplate: 当ajax哀求完成后,实行的js函数(不管哀求失败或乐成,都会实行)
[*]LoadingElementId:在ajax哀求期间,可以显示一段友爱的提示,该属性用于设置提示元素的ID
[*]LoadingElementDuration: 提示元素在显示和隐藏时,可以实行一段动画,该属性用于设置提示元素的动画实行时间
https://i-blog.csdnimg.cn/direct/1345b8aa5f9d45c09d1f93d7da06bfcd.png
Ajax.BeginForm

该ajax辅助方法用于以ajax方式提交表单数据.
https://i-blog.csdnimg.cn/direct/03c290dffcb14704a12488e92abab9e7.png
其他

如安在页面中加载分部视图?
方式一:调用Html.RenderPartial(“viewName”)
https://i-blog.csdnimg.cn/direct/ac89ba21764f4f4c908dc60f5f6e226b.png
方式二:调用Html.RenderAction(“actionName”)
他们之间的区别如下图所示:
https://i-blog.csdnimg.cn/direct/6d75fcc42fac4cd695fa7ba78ce3bb0a.png
何时使用RenderAction,何时使用RenderPartial?
如果需要向视图中通报数据,而原视图中又没有需要通报的数据时,就需要调用RenderAction.
注意: Html.RenderPartial有多种重载情势,下面列举它的2种常用情势:
Html.RenderPartial(“分布视图的名称”)
Html.RenderPartial(“分部视图的名称”,  object  模子数据)
如何从服务器获取一段json格式的字符串?
服务器的Action方法返回值范例为JsonResult,并且在方法内部可以调用Controller.Json()辅助方法.












ASP.NET MVC进阶四

ASP.NET MVC中使用母版页

ASPX视图引擎的母版页功能

Aspx视图引擎中母版页的用法,在webform模子和Mvc模子中,都是一样的.
Aspx视图有2个很紧张的标记:


[*]asp:ContentPlaceHolder标记
[*]asp:Content标记
asp:Content用于更换母版页中的asp:ContentPlaceHolder.
在母版页中应该根据实际需要,定义多个asp:ContentPlaceHolder,而非默认的2个.
注意:在mvc中添加母版页时肯定要选择 MVC3视图母版页,而不能选择下面的母版页和嵌套的母版页.
https://i-blog.csdnimg.cn/direct/6bcaeffea5fc41a68d79c39bed006ac8.png
在MVC中,没有提供嵌套的母版页模版文件,需要用户自行定义:
https://i-blog.csdnimg.cn/direct/270d5a2e3ca248f9817ff79a269dd83c.png
Razor视图引擎

Razor视图引擎的宗旨:将键盘的敲击次数降到最低
Razor基本语法



[*]定义变量:https://i-blog.csdnimg.cn/direct/44703fcfff6746f5b601fb0da5629aed.png


[*]输出变量的值:
https://i-blog.csdnimg.cn/direct/d9d9f54808f948ef9025fa3e4dc0258a.png


[*]如安在页面中原样输出@符号
https://i-blog.csdnimg.cn/direct/d15513983be84e1b9ab8f10fa59ffda9.png


[*]如安在页面中输出hisageis5.
https://i-blog.csdnimg.cn/direct/9d446b48e2164a97bd069ec140d52557.png


[*]if-else的写法:
https://i-blog.csdnimg.cn/direct/a78f6da5915e4215a5bc70e33e808879.png


[*]for|foreach的写法:
https://i-blog.csdnimg.cn/direct/48069a80f6e54053a9e6a852801dfc56.png
注意:如果在for循环中需要进行条件判定,不需要在if前加@符号.
https://i-blog.csdnimg.cn/direct/8893ab8bd84f4174b2470b4fb49073a7.png



[*]Html辅助方法的使用:
注意:@Html.TextBox()后面不能有分号.
https://i-blog.csdnimg.cn/direct/f3fadbe3a3004373b17f34c9a92953a2.png


[*]在razor视图页面中定义数据模子的范例信息:
https://i-blog.csdnimg.cn/direct/ca5be07f174545509829ee7acf830666.png


[*]在razor视图页面中加载分部视图或加载其他action:
注意:@{}里面的分号不能省略.
https://i-blog.csdnimg.cn/direct/f6f8d101b7764c2284e850d374eef8f1.png


[*]在Razor视图中如何生成form标记:
https://i-blog.csdnimg.cn/direct/4010be989aa547c590ace286cacb1caa.png
Razor视图引擎中母版页的用法



[*]Razor视图中母版页功能称之为布局页.
[*]Razor视图的布局页文件名必须以下划线_开头.
[*]Mvc项目中如何添加Razor布局页:
https://i-blog.csdnimg.cn/direct/409190795f9a4b6ab1f9c6c7409f28aa.png


[*]Razor视图中布局页的默认代码如下:
https://i-blog.csdnimg.cn/direct/67094f539f83480f9a198ab6e2520729.png
@RenderBody的作用同aspx视图中的asp:ContentPlaceHolder相似,用于加载内容页.


[*]Razor视图引擎中,如何让内容页继承布局页?
在内容页中使用Layout属性指定要继承的布局页.代码如下:
https://i-blog.csdnimg.cn/direct/64f4ffb8de7e46f88dde7aaa8db4c4cb.png
此中ViewBag.Title是用于设置布局页中的页面title.
如果不需要内容页继承布局页,只需要将Layout属性的值设置为null.
如果没有将Layout设置为null,而是将其删除掉,那么内容页仍然有可能会继承一个默认的布局页.因为在Views目录中存在一个名称为:_ViewStart.cshtml的文件,该文件是视图的默认配置文件,它里面设置了默认的布局页面,示例代码如下:
https://i-blog.csdnimg.cn/direct/0bd84e95d8d94c40975b88623a8ddbd3.png
嵌套的布局页,在mvc中也没有提供默认的模版文件,需要用户自行添加.
Html.RenderSection()

该辅助方法用于加载html片段.该段Html代码可以是本页面中定义的,也可以是内容页面中定义的.
示例代码如下:
https://i-blog.csdnimg.cn/direct/5455af3265eb4cf1ace7d7072b0449af.png
Razor视图中如何自定义辅助方法

使用@helper来定义辅助方法.示例代码如下:
https://i-blog.csdnimg.cn/direct/8640263bfb8d40bf9d3c2f3a6c8e3fbc.png
在ASP.NET MVC中如何实现模块化开发?

对于一个体系而言,每每包含前台和后台两大块.比如,前后台都包含用户登录功能,它们的控制器都叫Account,对应的登录方法也都叫Login,那么如何区分哪个是后台的,哪个是前台的???
ASP.NET MVC在2.0中就添加了Area(地区)的功能,用来解决上面的问题.
通过Area功能可以将一个大的软件项目划分为N个功能模块,每个功能模块中都可以相同名称的控制器和视图文件.
起首,右击项目,在弹出的右键菜单中选择----添加----地区
https://i-blog.csdnimg.cn/direct/1a42e8b28e22494ebd223ca19dd6f437.png
其他在地区对话框中填写地区的名称:
https://i-blog.csdnimg.cn/direct/e5f5021aff764fb9b635af48ae4f248e.png
创建好的目录结构如下图:
https://i-blog.csdnimg.cn/direct/3d2ad1bb717943ec928fe9f78cf4c1eb.png
每一个地区都有本身独立的一套MVC目录.
ASP.NET MVC数据分页

Aspx视图引擎和razor视图引擎中如何实现分页功能
重要使用了第三方的一个分页控件MvcPager.dll
分页功能分三步实现:
第一步是在项目中导入MvcPager.dll,并导入相应的定名空间: Webdiyer.WebControls.Mvc
第二步是在Action中组织要分页的数据
https://i-blog.csdnimg.cn/direct/2127e56dbd8f4dedafd20edd0aeb8e33.png
第三步是在页面中生成页码信息
https://i-blog.csdnimg.cn/direct/ee6d1ca087924f44889b9753de20d91b.png
注意:MvcPager.dll包罗非ajax和ajax两种使用模式.ajax模式下需要使用Ajax.Pager辅助方法.
其他



[*]如安在页面中加载静态文件(图片\css\js)?
使用Url.Content(“filePath”)方法.https://i-blog.csdnimg.cn/direct/d984ce67902f4ea1b08f75550a7f0f08.png


[*]添加新的Area后,访问报错的解决办法:
https://i-blog.csdnimg.cn/direct/8805dee1f0164fd4bea2b42d431046fd.png
修改Global.ashx文件中注册的默认路由
https://i-blog.csdnimg.cn/direct/0670cd4bc4364d6e876540d34353ff60.png


















ASP.NET MVC进阶五

重写Controller类的虚方法

OnActionExecuting\OnActionExecuted

OnActionExecuting:该方法在实行目的Action之前被调用
OnActionExecuted:该方法在实行目的Action之后被调用
https://i-blog.csdnimg.cn/direct/d7570144551041aebbf5414ae2d84013.png
OnResultExecuting\OnResultExecuted

OnResultExecuting:该方法在实行目的视图之前被调用
OnResultExecuted:该方法在实行目的视图之后被调用
OnAuthorization

该方法用于验证用户的授权信息.因此如果要进行身份的验证,应该在该方法中进行.
https://i-blog.csdnimg.cn/direct/6b7623f63e994d84a02d1c4f1a5d08ce.png
OnException

当访问Action出现异常时,该方法会主动被调用.
下面的示例代码演示了如何主动捕获体系异常,并将异常信息记录到日志文件中.
https://i-blog.csdnimg.cn/direct/aec0722997694c2b817b67c20a8edd48.png
ASP.NET MVC中的过滤器

过滤器是指在用户发送哀求时,MVC框架可以对用户的哀求进行拦截,根据特定的条件对这些哀求进行筛选过滤.
ASP.NET MVC中提供了下面几种过滤器,他们的作用和上面将的重写方法功能类似,但是这些过滤器是全局的,默认对所有的Action哀求都有用.
IAuthorizationFilter

授权过滤器
https://i-blog.csdnimg.cn/direct/99c30ae2e99c417b976189801996b627.png
IActionFilter

行为过滤器
https://i-blog.csdnimg.cn/direct/ba2323ada940496f88a5f7cb8dcdc8d8.png
IResultFilter

效果过滤器
https://i-blog.csdnimg.cn/direct/192a2469135f48cca51ec2bbabb68c06.png
IExceptionFilter

异常过滤器
https://i-blog.csdnimg.cn/direct/8cd8c50e4e3c47259c48924314900825.png
注意:过滤器需要在Global.asax文件中进行注册后方能起效.
https://i-blog.csdnimg.cn/direct/e0a07a4c621e4bca992367f15308c0da.png
































ASP.NET MVC扩展案例

1.ASP.NET MVC中使用富文本编辑器

ASP.NET MVC集成ueditor
kindeditor


2.ASP.NET MVC中如何使用模态对话框

Asp.net Mvc集成artDialog或zDialog


3.ASP.NET MVC中如何实现通用弹框功能

通用弹框功能包罗:从Action中返回视图时弹框;跨Action弹框;



4.数据验证Remote的扩展应用:

新增和修改部分时,如何控制部分名称不能为重复?



5.ASP.NET MVC中实现多文件上传

类似于QQ空间上传照片时,可以同时上传多张图片.


6.ASP.NET MVC应用程序主动发布

将MVC网站部署好之后,无需手工部署数据库,由程序引导用户完成数据库的部署(参考Aspx   面)

7.ASP.NET MVC中实现通用权限管理模块

按脚色分配体系功能菜单

C#.NET高级笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文-CSDN博客
MySQL口试题 2024 金九银十 最新 C# 高级 资深 DB 八股文-CSDN博客
国产佳构ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一_sqlsuger进阶-CSDN博客
C#高级开发 线上口试题20240711_c# 开发高级口试题-CSDN博客
Redis高频口试题-CSDN博客
数据库SqlServer笔试题_sqlserver 笔试题-CSDN博客
WPF 2024 金九银十 最新 高级 架构 口试题 C#_wpf 口试题-CSDN博客
WPF UI交互专题 界面结构化处理 查察分析工具Snoopy 逻辑树与视觉树 平面图像 平面图形 几何图形 弧线 01_wpf逻辑树和视觉树代码-CSDN博客
C#.NET Core 笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文-CSDN博客_net core笔试题-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: ASP.NET Webform和ASP.NET MVC 后台开发 大概80%常用技能