本文涉及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訪問器不能有具體的實現.
???????????
???????????
可空類型(可以為空的值類型)
對于值類型而言,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
ASP.NET MVC 模式 | .NET
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博客
Redis高頻面試題-CSDN博客
數據庫SqlServer筆試題_sqlserver 筆試題-CSDN博客
WPF 2024 金九銀十 最新 高級 架構 面試題 C#_wpf 面試題-CSDN博客
WPF UI交互專題 界面結構化處理 查看分析工具Snoopy 邏輯樹與視覺樹 平面圖像 平面圖形 幾何圖形 弧線 01_wpf邏輯樹和視覺樹代碼-CSDN博客
C#.NET Core 筆試題 架構 優化 性能提升 2024 金九銀十 最新 資深 八股文-CSDN博客_net core筆試題-CSDN博客