asp.net面試題總結1(未完待續。。。。)


1、MVC中的TempData\ViewBag\ViewData區別?

  答:頁面對象傳值,有這三種對象可以傳。

  

      Temp:臨時的

      Bag:袋子

  (1)  TempData  保存在Session中,Controller每次執行請求的時候,會從Session中先獲取 TempData,而后清除Session,獲取完TempData數據,雖然保存在內部字典對象中,但是其集合中的每個條目訪問一次后就從字典表中刪 除。具體代碼層面,TempData獲取過程是通過SessionStateTempDataProvider.LoadTempData方法從 ControllerContext的Session中讀取數據,而后清除Session,故TempData只能跨Controller傳遞一次。

 (2) ViewBag和ViewData只在當前Action中有效,等同於View

 (3)ViewData和ViewBag 中的值可以互相訪問,因為ViewBag的實現中包含了ViewData

 

2、ASP.NETASP.NET MVC的關系

 答:

 ASP.NET MVCASP.NET的子集

     mvc的核心命名空間System.Web.Mvc就能看出,因為System.WebAsp.NET的核心命名空間。

   ASP.NET MVC是在核心ASP.NET基礎之上構建的。

   具體體現在以下方面

(1)ASP.NET MVC依賴於HttpHandler

     關於請求是怎么進入控制器的,其實就是用到了HttpHandler

(2)SessionCookieCacheApplication這些ASP.NET的對象保存機制在MVC中依然是需要用到的

(3)HttpContextRequestResponseServer對象在MVC中仍然可以使用,在Controller中通過智能感知的形式很容易得到這些對象

 

3、闡述下MVC框架的機制,各個模塊的作用?

答:

我們來了解MVC的三大組件(模型、視圖、控制器)。
所謂模型,就是MVC需要提供的數據源,負責數據的訪問和維護。
所謂視圖,就是用於顯示模型中數據的用戶界面。
所謂控制器,就是用來處理用戶的輸入,負責改變模型的狀態並選擇適當的視圖來顯示模型的數據。
以下是我繪制的MVC三大組件之間的交互圖。
從交互圖中可以看出,MVC從用戶發送請求到頁面呈現結果大致經歷了五個步驟,分別如下:
(1). 用戶在瀏覽器輸入地址,向頁面發送請求(實則是向控制器發出相關命令);
(2). 控制器接受命令后,向模型請求獲得相關的數據;
(3). 模型將相應的數據返回給控制器;
(4). 控制器將相關數據發送到指定的視圖;
(5). 指定的視圖呈現相關的數據。
 
當啟動MVC網站時,用戶輸入的URL地址將首先傳遞到UrlRoutingModule模塊,該模塊將解析該URL並選擇對應的URL路由,並得到對應的IHttpContext對象來處理該URL路由。在默認情況下,該IHttpContext對象就是MvcHandler對象,通過該對象來選擇相關的控制器來處理用戶的請求。即UrlRoutingModule模塊和MvcHandler對象是MVC網站的入口點,主要實現:選擇對應的控制器,實例化控制器對象,調用控制器的相關方法。以下表格更詳細地說明頁面請求的執行過程。
 
總結:

1、UrlRoutingModule模塊截獲請求,從路由表中得到該URL對應的RouteData
2、RouteData+URL封裝成一個IHttpContext對象
3、IHttpContext對象從RouteData中得到Controller名字,根據名字反射創建Controller對象
4、Controller對象執行對應的Action方法,並返回View()

 
4、存儲過程的優缺點?
 答:
優點:
1.執行速度快。存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2.減少網絡通信量。當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數據庫。而換成存儲,只需要連接一次數據庫就可以了。
3.存儲過程可以重復使用,可減少數據庫開發人員的工作量。
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。
 
缺點:
1、可移植性差。不同的數據庫語法不一樣哦
 
5、drop、truncate、delete三者刪除的區別?
答:

一:用法和區別

drop:drop table 表名

      刪除內容和定義,並釋放空間。執行drop語句,將使此表的結構一起刪除。

truncate (清空表中的數據):truncate table 表名

      刪除內容、釋放空間但不刪除定義(也就是保留表的數據結構)。與drop不同的是,只是清空表數據而已。

      truncate不能刪除行數據,雖然只刪除數據,但是比delete徹底,它只刪除表數據。

delete:delete from 表名 (where 列名 = 值)

       與truncate類似,delete也只刪除內容、釋放空間但不刪除定義;但是delete即可以對行數據進行刪除,也可以對整表數據進行刪除。

二:注意

      1.delete語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日志中保存,以便進行進行回滾操作。

      2.執行速度一般來說:drop>truncate>delete

      3.delete語句是數據庫操作語言(dml),這個操作會放到 rollback segement 中,事務提交之后才生效;如果有相應的 trigger,執行的時候將被觸發。

      4.truncate、drop 是數據庫定義語言(ddl),操作立即生效,原數據不放到 rollback segment 中,不能回滾,操作不觸發trigger。

      5.truncate語句執行以后,id標識列還是按順序排列,保持連續;而delete語句執行后,ID標識列不連續

 

6、描述EF和ado.net的優缺點?

  答:

           EF  優點:(1)面向對象編程

                            (2)代碼量少,開發方便

                  缺點:(1)有一定的性能損耗

                             (2)優化的時候不靈活,不如直接寫sql

 

         ado.net 優點:(1)直接操作數據庫,速度快

                                (2)優化sql靈活

                     缺點:(1)代碼量大,自己處理的事情多

 

7、MVC的Filter有幾種?分別是什么?主要特點是什么?

 

8、闡述下數據庫的三大范式?

   答: 

第一范式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。
個人理解:列不可分(原子性,即字段不可以再分)
 
第二范式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。
個人理解:不存在部分依賴(唯一性,不可以把多種數據保存在同一張表中,即一張表只能保存“一種”數據)
 
第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。
個人理解:不存在傳遞依賴(直接性,每一列都和主鍵直接相關,而不能間接相關)

 

9、怎么理解線程池,他的優缺點有哪些?

   答:  線程池是用來存放線程的對象池。線程池的目的就是因為創建一個線程代價比較高,因此我們使用線程池來復用線程。

           優點:

                 (1)減少創建線程的開銷,線程能復用

 

          缺點:

               (1)不能設置池中線程的優先級和名稱

               (2)線程池中的所有線程都是后台線程。如果進程的所有前台線程都結束了,所有的后台線程就會停止。不能把入池的線程改為前台線程

 

10、視圖有更新操作,你不知道嗎?

    答:

通過視圖更新數據的必須條件
1、SELECT語句中沒有使用聚合函數或Group by、Union、Distinct或Top子句
2、INSERT、UPDATE、DELETE語句必須滿足一定的條件才能引用可更新的視圖
 
通過視圖更新數據的場景比較少,大家只是了解下視圖可以更新就行了。
 
11、EntityFramework懶加載與預加載分別是設么?怎么理解
 答:
1、延遲加載又叫惰性加載(Lazy Loading):即在需要或者使用的時候加載數據。默認情況下,EF會使用延遲加載方式加載數據,即數據庫上下文的屬性:Configuration.LazyLoadingEnabled = true;
  eg:var customers = from c in dbcontext.Customer select c;
2、預加載:如果你想讓所有數據一次性全部加載到內存中,那么你需要使用.Include(Entity)方法 。.Include(Entity)方法允許級聯使用,你可以預先加載具有多層級結構的數據。
  eg:var q = from t in dbcontext.Customer.Include("Order") select t;
 
比較兩種加載方式
預加載:
• 減少數據訪問的延遲,在一次數據庫的訪問中返回所有的數據。不過缺點是,那就是如果數據量較大,一次性將所有數據載入內存往往並不是最明智的選擇
• 減少與數據庫的交互次數
延遲加載:
• 非常寬容,因為只在需要的時候加載數據,不需要預先計划
• 可能會因為數據訪問的延遲而降低性能,考慮到每訪問父實體的子實體時,就需要訪問數據庫。
3、顯式加載和延遲加載非常類似,不同的是顯式加載要手動關閉EF的延遲加載屬性,通過代碼ctx.Configuration.LazyLoadingEnabled = false;來完成。

 

 

(未完待續。。。。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM