本文涉及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博客
数据库SqlServer笔试题_sqlserver 笔试题-CSDN博客
WPF 2024 金九银十 最新 高级 架构 面试题 C#_wpf 面试题-CSDN博客
WPF UI交互专题 界面结构化处理 查看分析工具Snoopy 逻辑树与视觉树 平面图像 平面图形 几何图形 弧线 01_wpf逻辑树和视觉树代码-CSDN博客
C#.NET Core 笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文-CSDN博客_net core笔试题-CSDN博客
ASP.NET 框架技术
ASP.NET Webform模型和ASP.NET MVC模型的关系
OnActionExecuting\OnActionExecuted
OnResultExecuting\OnResultExecuted
第一章C#语言新特性
自动属性
下面两种写法作用相同.前者属于自动属性.在使用自动属性时应该注意:get和set访问器不能有具体的实现.

可空类型(可以为空的值类型)
对于值类型而言,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>:键值对类型
对象初始化器
利用对象初始化器,在实例化一个类对象的同时可以为它的属性赋值.
集合初始化器
利用集合初始化器,可以在实例化一个集合对象时为它指定元素
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{}即可动态创建类对象.
扩展方法
扩展方法是指:为以前定义好的类扩展其他方法.具体步骤如下:
- 首先,定义一个静态类(类的名称没有限制)
- 其次,在静态类中定义一个静态方法(方法返回值根据实际情况自定定义)
- 最后,给上述静态方法添加一个参数,且该参数必须被this关键字修饰.
注意: 上面被this关键字修饰的参数的类型就是该扩展方法所扩展的类型
下面的代码演示了如何为string类扩展名称为Convert的无参方法.
匿名类型和Lambda表达式
- 什么是委托:委托允许将一个方法作为参数,传递给另外一个方法.
下面的代码演示了如果使用委托计算2个数字的加法\减法\乘法.
委托和挂载的方法:参数个数\参数类型\参数顺序\返回值类型必须要一致.
- 但是上述方式,使用很复杂.我们可以通过匿名方法来简写上述功能.=符号右侧的就是匿名方法.

- Lambda表达式也是匿名方法的一种.并且它的语法更加简洁明了.
Lambda表达式分3部分 : 参数 | => | 表达式
下面的代码演示了如果使用Lambda表达式改写委托的示例.其中3个粉色的线框就是Lambda的3部分.

注意1:如果Lambda表达式只有1个参数,那么参数部分可以不用()包裹
注意2:Lambda表达式部分可以使用{}包裹,也可以不包裹.如果有多行代码,必须要使用{}包裹起来.
- 在出现委托(Func参数)的地方,我们就可以写Lambda表达式.
Func<T, K>是一个泛型委托.该委托的参数类型为T,返回值类型为K.
![]()
Lambda表达式的参数arg的类型为T,Lambda的表达式部分返回值类型为K.
分部类
分部类允许将一个类的定义拆分到多个文件中.Winform应用程序和ASP.NET Webform应用程序中的每一个窗体所对应的后台类就采用了分部类技术.
分部类的语法就是:在类声明时,在关键字class前添加partial关键字.
下面的代码将名称为Person的类拆分到了2个类文件中,分别是:Person.cs文件和PersonExt.cs文件.

第二章 Linq查询知识点详解
Linq标准查询语法格式
var data = from 变量 in 集合对象
where 布尔表达式
orderby 排序字段 descending|ascending
select 变量;
解释:
select:提取要查询的数据 where:筛选满足条件的元素
from 变量:该变量指代集合中的单个元素 in:从哪里筛选元素
orderby:排序 descending:降序 ascending:升序
注意:where是可选的,如果不加where则表示筛选所有元素.
示例代码:
使用Linq进行数据查询的条件
数据源(in 后面的集合对象)必须直接或间接继承自IEnumerable<T>
或者说:只要数据源继承自IEnumerable<T>,我们就可以使用Linq从它里面检索数据
Where关键字
筛选满足条件的元素,where关键字后面一定要跟布尔表达式
Where后面的布尔表达式可以很简单,也可以是复杂的表达式.
注意:
注意from关键字后面可以出现多个where表达式,这些表达式之间是并且的关系
Select关键字
Select关键字用于提取要查询的数据.
Select后面可以直接跟from后面的变量;也可以跟一个匿名类型.

Count()方法
Count(expression<Func<T, bool>>)
解释:T代表Lambda表达式中的参数部分,bool代表Lambda表达式部分为布尔类型
Count方法用于获取满足条件的记录数量(有多少个满足条件的记录)
Max()和Min()
Max(Expression<Func<T, K>>)和Min(Expression<Func<T, K>>)
Max:求最大值 Min:求最小值

First()和FirstOrDefault()
First(Expression<Func<T, bool>>)
FirstOrDefault(Expression<Func<T, bool>>)
两个方法都是从集合中筛选满足条件的第一个元素.
区别:当没有从集合中筛选到满足的条件的元素时,First将会报错,FirstOrDefault则不会报错.

Average()方法
该方法用于计算平均值
Linq的联合查询
将两个集合进行关联,然后从这两个集合中提取所需要的数据.
语法格式:
var data = from 变量1 in 集合1
from 变量2 in 集合2
where 变量1.属性 == 变量2.属性
select new { ... ...}
提示:可以将N个集合进行关联(N>=2)
示例代码:
Sum()
Sum(Func<T, K>)
其中T为参数的类型,K为返回值的类型.
Sum()方法用于对数据进行求和运算.

OrderBy()和OrderByDescending()
这两个方法用于实现对数据进行排序(升序和降序)

group by分组
分组的标准语法:
var data = from 变量1 in 集合对象
group 变量1 by 变量1.属性 into 变量2
select 变量2;
注意:使用group by分组后,将不能使用之前的变量1,需要通过into关键字定义一个新的变量2.新的变量指代的是分组后的每一组.
关于分组的示例

其他:
- 在进行数据查询时,.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属性即可实现检测功能.

Linq To Sql设计器
在服务器资源管理器中通过拖拽的方式,将数据表放置到Linq To Sql的设计器区域后,VS会自动将这些数据表生成N+1(N为数据表的个数)个类.这些类大致可以分为2种:一种是数据库上下文,另一种是实体类.数据库上下文类就是名称以DataContext结尾的类,它继承自Sytem.Data.Linq.DataContext.
他们的作用分别是:DataContext类用于和数据库交互(增删改查),每次进行数据库操作时,都应该先创建该类对象;
而每一个实体类则和数据表相对应.
DataContext的特性标记为Database,表示与数据库相关

实体类的特性标记是Table,表示与数据表相关

实体类中属性的特性标记是Column,表示与数据列相关

DataContext数据库上下文类的常用属性和方法
CreateDatabase():创建数据库
DeleteDatabase():删除数据库
DatabaseExits():判断数据库是否存在
Log:该属性用于检测和写入LINQ TO SQL生成的SQL语句
Linq To Sql常用操作
新增数据
void InsertOnSubmit():实现每次新增1条记录
void InsertAllOnSubmit():实现一次新增多条记录
注意:调用InsertOnSubmit后,一定要再调用DataContext.SubmitChanges();

修改数据
首先,查询到要修改的元素
其次,改变元素相应的属性
最后,调用dataContext.SubmitChanges()

删除数据
首先,查询到要删除的元素
其次,调用void DeleteOnSubmit()删除单个元素,如果要删除多个可以调用void DelteAllOnSubmit()
最后,调用dataContext.SubmitChanges();

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

多表查询:

典型应用场景
场景1:服务器获取动态表单数据

做法一:

做法二:

上述两种做法都可以实现功能.做法一是先实现工资模版的新增,然后再新增工资条目.做法二是向工资模版对象中添加多个工资条目,然后向数据库提交工资模版.
需要注意的是,做法一中为工资条目对象设置了工资模版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
MVC三大组件的相互关系
- 在控制器中可以直接调用视图和模型
- 在视图中可以调用模型.
- 模型不能调用视图
- 模型能够限定视图中使用的数据,但视图中使用的模型应由控制器提供
- 在视图中可以调用控制器(通过视图中表单的提交和点击超链接的方式调用)

ASP.NET Webform模型和ASP.NET MVC模型的关系
二者都是基于ASP.NET Web框架构建的开发模型.所以ASP.NET中的一些功能可以被二者公用.
Webform编程模型是典型的以事件驱动的web模型,而MVC则不是.
Webform的URL地址是基于文件系统的,而MVC则是基于Action.

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
- 在方法上添加特性标记[NonAction]

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

- 如何在Action中获取表单提交的数据?
表单中提交的数据,可以通过Action的参数进行映射.
映射的前提条件:Html标记的name属性值和action中参数的名称要一致.
下面的示例代码演示了映射的过程(注意粉色框标记的部分):

- Action中如何映射复杂对象?
对于上面的映射代码,我们还可以有另外一种等价的写法,就是将映射的属性定义到一个实体类中,这样我们就可以在action中添加该实体类型的参数,参考代码如下所示:

- 如何从一个Action中跳转至另外一个Action?
新增或修改功能完成后,需要跳转至数据列表页面,我们可以通过如下代码实现:
代码 => return RedirectToAction(“ActionName”, “ControllerName”).
视图相关
- 在ASPX视图引擎中,可以使用asp服务器控件,但它的作用仅仅局限与生成html代码,而不推荐开发人员使用asp控件的事件.因此建议开发人员手工编写Html标记。
但是手写Html标记比较耗费时间,有没有更好的解决方案?答案就是使用Html辅助方法。
- Html辅助方法
Html辅助方法的作用就是通过调用C#方法的方式,快速的生成相应的html标记.
Html辅助方法分为2大类:弱类型html辅助方法和强类型html辅助方法.
其中以For关键字结尾的都是强类型的辅助方法.下面的示例代码演示了二者的调用方式,以及生成的html源码。


注意:Html辅助方法有很多种重载形式,在开发过程中可以根据实际需要自行选择.比如要实现一个包含class\style\onchange属性和事件的单行文本框,可以参考如下代码:

强调:如何使用HTML辅助方法生成form标记?
生成form标记的两个Html辅助方法为:Html.BeginForm()和Html.EndForm(),但他们在使用时和其他的Html辅助方法有所不同,下面的示例代码演示了它们的两种用法:

- 如何在URL地址中传递参数?
场景一:将学生ID值映射到名称为id参数上
场景二:将学生ID值映射到名称为stuId参数上
场景三:url地址中包括stuId和name两个参数
这三种场景的使用代码如下所示:

其他
- 在实际开发过程中,一个小的功能模块就对应一个控制器.比如学生信息管理就是一个控制器,新增学生\修改学生\查询学生列表\删除学生都可以对应控制器中的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属性中提取)。

在视图中使用Html.DropDownList绑定Ienumerable<SelectListItem>

ASP.NET MVC进阶二
数据验证
数据验证的步骤
-
-
-
- 在模型类中添加与验证相关的特性标记
- 在客户端导入与验证相关的js文件和css文件
- 使用与验证相关的Html辅助方法
- 在服务器端判断是否通过服务器端验证
-
-
常用的验证标记

- Required:非空验证
- StringLength:验证字符串的长度
- RegularExpression:正则表达式验证
- Compare:比较两个字段的值是否相等
- Range:范围验证
- Remote:服务器验证(需要在controller中编写返回值为JsonResult的Action)
- 自定义验证标记
与验证相关的js文件
在ASP.NET MVC中提供了2套验证框架,分别是微软验证框架和jquery验证框架.默认启用了jquery验证框架.
注意:这些js文件的顺序不能颠倒;其中Site.css文件中定义了数据验证使用的样式.

验证相关的Html辅助方法
注意:1.必须使用Html.ValidationMessage()和Html.ValidationMessageFor()来显示验证失效的提示信息;
2.被验证的控件(如文本框\下拉列表框等)必须使用Html辅助方法生成才有效.

在服务器端判断模型是否通过了验证(服务器端验证)
页面中如果使用了MVC验证功能,那么在后台对应的Action中必须通过ModelState.IsValid判断是否通过了服务器端验证。只有通过了服务器端验证,才能执行其他的业务逻辑代码。

使用要点:
- 被验证的标记不能是纯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来提取数据.

ViewBag
ViewBag是一个动态类型的属性。在ASP.NET MVC 3.0中才加入了ViewBag属性.
动态类型:dynamic,就是可以事先不为其定义属性,通过直接给属性赋值的方式就可以随时为它添加新的属性.
下面的代码演示了向ViewBag中存放cls和stu两个对象,这两个对象分别放到了属性ClassInfo和StudentInfo中。

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);

RedirectToRouteResult类
该类的作用是从当前action跳转至其他action.
在Controller类中的辅助方法为:RedirectToAction(“ActionName”, “ControllerName”)
RedirectResult类
在服务器端从当前Action跳转到其他URL地址.
在Controller类中的辅助方法为:Controller.Redirect(string url)

JsonResult类
该类用于向客户端返回一段Json格式的字符串.
在Controller类中的辅助方法为:Controller.Json(object data);
注意:默认情况下mvc拒绝响应以get方式发送的ajax请求,需要使用JsonRequestBehavior.AllowGet。

PartialViewResult类
该类的作用是向客户端响应Views目录的一个分部视图文件。分部视图就是只包含html片段的视图文件.
在Controller类中的辅助方法为:Controller.PartialView();

下图演示了在创建视图文件时,如何创建一个分部视图文件(勾选“创建为分部视图”复选框):

FilePathResult类
该类用于实现文件下载.
在Controller类中的辅助方法为:Controller.File(string filePath, string contentType, string fileName);

FileContentResult类
略
FileStreamResult类
略
EmptyResult类
该类用于向客户端响应一个空结果。
HttpStatusCodeResult类
该类用于向客户端相应指定的状态码.
HttpNotFoundResult类就是HttpStatusCodeResult的子类,表示404这一状态码。
下面的是一些常用的http状态码:
404:资源未找到(表示客户端请求服务器的资源地址不存在)
500:服务器内部错误(以5XX开头的表示服务器端在处理过程中出现的错误)
200:成功(表示客户端发送的请求被服务器成功的处理和响应)
其他
如何在aspx页面中导入命名空间?
方式一:在指定的页面添加<%@ Import Namespace=”命名空间” %>

方式二:在项目的web.config配置文件中添加pages---namespaces----add

通过方式二添加的命名空间可以在所有的aspx页面中使用;而方式一添加的命名空间只能在当前页面中使用.
ASP.NET MVC进阶三
ASP.NET MVC中的AJAX应用
首先,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(顺序不能颠倒):

ASP.NET MVC提供了2个常用的ajax辅助方法.
Ajax.ActionLink
该辅助方法用于在页面上生成具有ajax功能的超链接.

在该辅助方法中有一个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: 提示元素在显示和隐藏时,可以执行一段动画,该属性用于设置提示元素的动画执行时间

Ajax.BeginForm
该ajax辅助方法用于以ajax方式提交表单数据.

其他
如何在页面中加载分部视图?
方式一:调用Html.RenderPartial(“viewName”)

方式二:调用Html.RenderAction(“actionName”)
他们之间的区别如下图所示:

何时使用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视图母版页,而不能选择下面的母版页和嵌套的母版页.

在MVC中,没有提供嵌套的母版页模版文件,需要用户自行定义:

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

- 输出变量的值:

- 如何在页面中原样输出@符号
![]()
- 如何在页面中输出hisageis5.

- if-else的写法:

- for|foreach的写法:

注意:如果在for循环中需要进行条件判断,不需要在if前加@符号.

- Html辅助方法的使用:
注意:@Html.TextBox()后面不能有分号.

- 在razor视图页面中定义数据模型的类型信息:

- 在razor视图页面中加载分部视图或加载其他action:
注意:@{}里面的分号不能省略.

- 在Razor视图中如何生成form标记:

Razor视图引擎中母版页的用法
- Razor视图中母版页功能称之为布局页.
- Razor视图的布局页文件名必须以下划线_开头.
- Mvc项目中如何添加Razor布局页:

- Razor视图中布局页的默认代码如下:

@RenderBody的作用同aspx视图中的asp:ContentPlaceHolder相似,用于加载内容页.
- Razor视图引擎中,如何让内容页继承布局页?
在内容页中使用Layout属性指定要继承的布局页.代码如下:

其中ViewBag.Title是用于设置布局页中的页面title.
如果不需要内容页继承布局页,只需要将Layout属性的值设置为null.
如果没有将Layout设置为null,而是将其删除掉,那么内容页仍然有可能会继承一个默认的布局页.因为在Views目录中存在一个名称为:_ViewStart.cshtml的文件,该文件是视图的默认配置文件,它里面设置了默认的布局页面,示例代码如下:

嵌套的布局页,在mvc中也没有提供默认的模版文件,需要用户自行添加.
Html.RenderSection()
该辅助方法用于加载html片段.该段Html代码可以是本页面中定义的,也可以是内容页面中定义的.
示例代码如下:

Razor视图中如何自定义辅助方法
使用@helper来定义辅助方法.示例代码如下:

在ASP.NET MVC中如何实现模块化开发?
对于一个系统而言,往往包含前台和后台两大块.比如,前后台都包含用户登录功能,它们的控制器都叫Account,对应的登录方法也都叫Login,那么如何区分哪个是后台的,哪个是前台的???
ASP.NET MVC在2.0中就添加了Area(区域)的功能,用来解决上面的问题.
通过Area功能可以将一个大的软件项目划分为N个功能模块,每个功能模块中都可以相同名称的控制器和视图文件.
首先,右击项目,在弹出的右键菜单中选择----添加----区域

其他在区域对话框中填写区域的名称:

创建好的目录结构如下图:

每一个区域都有自己独立的一套MVC目录.
ASP.NET MVC数据分页
Aspx视图引擎和razor视图引擎中如何实现分页功能
主要使用了第三方的一个分页控件MvcPager.dll
分页功能分三步实现:
第一步是在项目中导入MvcPager.dll,并导入相应的命名空间: Webdiyer.WebControls.Mvc
第二步是在Action中组织要分页的数据

第三步是在页面中生成页码信息

注意:MvcPager.dll包括非ajax和ajax两种使用模式.ajax模式下需要使用Ajax.Pager辅助方法.
其他
- 如何在页面中加载静态文件(图片\css\js)?
使用Url.Content(“filePath”)方法.
- 添加新的Area后,访问报错的解决办法:

修改Global.ashx文件中注册的默认路由

ASP.NET MVC进阶五
重写Controller类的虚方法
OnActionExecuting\OnActionExecuted
OnActionExecuting:该方法在执行目标Action之前被调用
OnActionExecuted:该方法在执行目标Action之后被调用

OnResultExecuting\OnResultExecuted
OnResultExecuting:该方法在执行目标视图之前被调用
OnResultExecuted:该方法在执行目标视图之后被调用
OnAuthorization
该方法用于验证用户的授权信息.因此如果要进行身份的验证,应该在该方法中进行.

OnException
当访问Action出现异常时,该方法会自动被调用.
下面的示例代码演示了如何自动捕获系统异常,并将异常信息记录到日志文件中.

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

IActionFilter
行为过滤器

IResultFilter
结果过滤器

IExceptionFilter
异常过滤器

注意:过滤器需要在Global.asax文件中进行注册后方能起效.

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博客
数据库SqlServer笔试题_sqlserver 笔试题-CSDN博客
WPF 2024 金九银十 最新 高级 架构 面试题 C#_wpf 面试题-CSDN博客
WPF UI交互专题 界面结构化处理 查看分析工具Snoopy 逻辑树与视觉树 平面图像 平面图形 几何图形 弧线 01_wpf逻辑树和视觉树代码-CSDN博客
C#.NET Core 笔试题 架构 优化 性能提升 2024 金九银十 最新 资深 八股文-CSDN博客_net core笔试题-CSDN博客











248

被折叠的 条评论
为什么被折叠?



