本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分,ASP.NET MVC 5、ASP.NET WEB API2。本書最大的特點是以面試問答的形式進行展開。通讀此書,會幫助你對ASP.NET MVC有更深層次的理解。
由于個人技術水平和英文水平也是有限的,因此錯誤在所難免,希望大家多多留言指正。
系列導航
Asp.net mvc 知多少(一)
Asp.net mvc 知多少(二)
Asp.net mvc 知多少(三)
Asp.net mvc 知多少(四)
Asp.net mvc 知多少(五)
Asp.net mvc 知多少(六)
Asp.net mvc 知多少(七)
Asp.net mvc 知多少(八)
Asp.net mvc 知多少(九)
Asp.net mvc 知多少(十)
本節主要講解幾種頁面傳值方式和http請求與action的映射
Q50. 介紹下ViewData, ViewBag, TempData 和 Session間的不同之處?
Ans. 在ASP.NET MVC 中有三種方式從controller傳值到view中:ViewData, ViewBag 和 TempData。Asp.net WebForm 中可以在一次用戶會話中使用Session去持久化數據。
ViewData
- ViewData 是一個繼承自
ViewDataDictionary
類的字典對象。
public ViewDataDictionary ViewData { get; set; }
- ViewData 用來從controller中傳值到相對應的view中。
- 生命周期僅存在于當前此次請求。
- 如果發生重定向,那么值將會被清空。
- 從ViewData中取值時需要進行類型轉換和Null Check以避免異常。
ViewBag
- ViewBag ViewBag是一個動態屬性,是基于C# 4.0的動態語言的特性。
public Object ViewBag { get;}
- 是對ViewData的一次包裝,也是用來從controller中傳值到相對應的view中。
- 生命周期僅存在于當前此次請求。
- 如果發生重定向,那么值將會被清空。
- 從ViewBag中取值時不需要進行類型轉換。
TempData
- TempData 是一個繼承于
TempDataDictionary
類的字典對象,存儲于Session中 。
public TempDataDictionary TempData { get; set; }
- TempData 用來進行跨頁面請求傳值。
- TempData被請求后生命周期即結束。
- 從TempData中取值時需要進行類型轉換和Null Check以避免異常。
- 主要用來存儲一次性數據信息,比如error messages, validation messages。
詳情可參考:TempData知多少,
Session - ASP.NET MVC中Session是Controller中的一個屬性,Session是HttpSessionStateBase類型。
public HttpSessionStateBase Session { get; }
- Session保存數據直到用戶會話結束(默認session過期時間為20mins)。
- Session對所有的請求都有效,不僅僅是單一的跳轉。
- 從Session中取值時需要進行類型轉換和Null Check以避免異常。
Q51. 如何持久化TempData?
Ans. TempData的生命周期十分短暫,只能存活到目標視圖完全加載之后。
但是我們可以通過調用Keep
方法去持久化TempData至下一次訪問。
- void Keep() - 調用這個方法將保證此次請求之后所有的TempData都將會被持久化。
public ActionResult Index()
{
ViewBag.Message = TempData["Message"];
Employee emp = TempData["emp"] as Employee; //need type casting
TempData.Keep();//persist all strings values
return View();
}
- void Keep(string key) - 調用這個方法將保證此次請求之后指定的TempData會被持久化。
public ActionResult Index()
{
ViewBag.Message = TempData["Message"];
Employee emp = TempData["emp"] as Employee; //need type casting
//persist only data for emp key and Message key will be destroy
TempData.Keep("emp");
return View();
}
Q52. ASP.NET MVC中如何控制session的行為?
Ans. 默認ASP.NET MVC 支持 session state(會話狀態). Session用來存儲跨請求
期間的數據。 不管你是否在session中存儲數據,ASP.NET MVC都必須為所有的controller管理 session state,且是耗時的 。因此session是存儲在服務器端的,消耗服務器的內存,所以必然影響你的應用程序的性能。 如果你的某些controller不需要session控制,可以手動關閉session控制,來增加微小的性能提升。
可以通過 session state的配置項來簡化它。
ASP.NET MVC4中的SessionState
特性中,可以通過指定SessionStateBehavior
枚舉來實現更多對session-state的控制。
- Default :默認的session state控制方式。
- Disabled: Session state完全關閉。
- ReadOnly:只讀的session state。
- Required:完全的可讀寫的 session state。
Q53. ASP.NET MVC中 TempData與Session 有什么關聯關系?
Ans. ASP.NET MVC中TempData使用session存儲跨請求的臨時數據。因此,當你關閉了controller的session,當你去使用TempData時,就會拋出以下異常。
Q54. ASP.NET MVC中什么是Action方法?
Ans. Controller中的action是定義在Controller類中的方法用來執行基于用戶請求的操作,并在Model的幫助下將結果傳遞會View。
Asp.net MVC 中集成了以下幾種ActionResults類型及對應的幫助類方法:
- ViewResult - 使用Controller中提供的
View()
方法返回一個ViewResult用來呈現指定或默認的View。 - PartialViewResult- 使用Controller中提供的
PartialView()
方法返回一個PartialViewResult用來呈現指定或默認的分部視圖。 - RedirectResult - 使用Controller中提供的
Redirect()
方法返回一個RedirectResult用來發起一個 HTTP 301 或 302 到指定URL的跳轉。 - RedirectToRouteResult - 使用Controller中提供的
RedirectToAction(), RedirectToActionPermanent(), RedirectToRoute(), RedirectToRoutePermanent()
方法返回一個RedirectToRouteResult用來發起一個 HTTP 301或 302 到指定action或者路由的跳轉。 - ContentResult - 使用Controller中提供的
Content()
方法返回一個ContentResult用來呈現指定的文本。 - JsonResult - 使用Controller中提供的
Json()
方法返回一個JsonResult用來呈現序列化的Json格式數據。 - JavaScriptResult - 使用Controller中提供的
JavaScript()
方法返回一個JavaScriptResult用來呈現一段JavaScript代碼,一般僅用于Ajax請求的場景。 - FileResult - 使用Controller中提供的
File()
方法返回一個FileResult用來呈現文件(PDF, DOC, Excel等)內容。 - EmptyResult - 返回一個空的結果。
- HttpNotFoundResult - 使用Controller中提供的
HttpNotFound()
方法返回一個HTTP 404狀態。 - HttpUnauthorizedResult - 返回一個HttpUnauthorizedResult類型用來表示HTTP 401狀態(未認證)。用來要求用戶登錄以完成認證。
- HttpStatusCodeResult - 返回 HttpStatusCodeResult用來表示指定Http狀態。
Q56. ASP.NET MVC中如何標記Non-Action方法?
Ans. ASP.NET MVC 將所有的公共方法默認為action方法。
如果不想某個公共的方法被暴露為Action,僅需要用NonActionAttribute
標記方法即可。
[NonAction]
public void DoSomething()
{
// Method logic
}
Q57. 能否更改Action方法的命名?
Ans. 可以通過ActionName
特性來修改Action的命名。修改后Action將用ActionName
中定義的名稱被調用。
[ActionName("DoAction")]
public ActionResult DoSomething()
{
//TODO:
return View();
}
這樣,DoSomething
action就會被會被標記為DoAction
action。
Q58. 如何限制action僅能被相應的HTTP GET, POST, PUT or DELETE請求訪問?
Ans. 默認,每一個action方法都可以被任何HTTP請求訪問(i.e. GET, PUT, POST,
DELETE). 但是可以通過為action方法指定HttpPost、 HttpPut 、 HttpDelete 特性來限制action的行為。
[HttpGet]
public ActionResult Index()
{
//TODO:
return View();
}
Q59. 如何決定一個action是被HTTP GET還是POST請求?
Ans. 通過使用HttpRequestBase
類的HttpMethod
屬性可以判斷action是被哪種HTTP請求調用。
public ActionResult Index(int? id)
{
if (Request.HttpMethod == "GET")
{
//TODO:
}
else if (Request.HttpMethod == "POST")
{
//TODO:
}
else
{
//TODO:
}
return View();
}
Q60. 如何判斷一個AJAX請求?
Ans. 通過使用Request.IsAjaxRequest()
來判斷。
public ActionResult DoSomething()
{
if (Request.IsAjaxRequest())
{
//TODO:
}
return View();
}