本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan侠草,想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分汁讼,ASP.NET MVC 5哼凯、ASP.NET WEB API2。本書最大的特點是以面試問答的形式進(jìn)行展開。通讀此書蚣录,會幫助你對ASP.NET MVC有更深層次的理解午衰。
由于個人技術(shù)水平和英文水平也是有限的立宜,因此錯誤在所難免,希望大家多多留言指正臊岸。
系列導(dǎo)航
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 知多少(十)
本節(jié)主要講解幾種頁面?zhèn)髦捣绞胶蚳ttp請求與action的映射
Q50. 介紹下ViewData, ViewBag, TempData 和 Session間的不同之處?
Ans. 在ASP.NET MVC 中有三種方式從controller傳值到view中:ViewData, ViewBag 和 TempData橙数。Asp.net WebForm 中可以在一次用戶會話中使用Session去持久化數(shù)據(jù)。
ViewData
- ViewData 是一個繼承自
ViewDataDictionary
類的字典對象帅戒。
public ViewDataDictionary ViewData { get; set; }
- ViewData 用來從controller中傳值到相對應(yīng)的view中灯帮。
- 生命周期僅存在于當(dāng)前此次請求。
- 如果發(fā)生重定向逻住,那么值將會被清空钟哥。
- 從ViewData中取值時需要進(jìn)行類型轉(zhuǎn)換和Null Check以避免異常。
ViewBag
- ViewBag ViewBag是一個動態(tài)屬性瞎访,是基于C# 4.0的動態(tài)語言的特性腻贰。
public Object ViewBag { get;}
- 是對ViewData的一次包裝,也是用來從controller中傳值到相對應(yīng)的view中装诡。
- 生命周期僅存在于當(dāng)前此次請求银受。
- 如果發(fā)生重定向,那么值將會被清空鸦采。
- 從ViewBag中取值時不需要進(jìn)行類型轉(zhuǎn)換宾巍。
TempData
- TempData 是一個繼承于
TempDataDictionary
類的字典對象,存儲于Session中 渔伯。
public TempDataDictionary TempData { get; set; }
- TempData 用來進(jìn)行跨頁面請求傳值顶霞。
- TempData被請求后生命周期即結(jié)束。
- 從TempData中取值時需要進(jìn)行類型轉(zhuǎn)換和Null Check以避免異常。
- 主要用來存儲一次性數(shù)據(jù)信息选浑,比如error messages, validation messages蓝厌。
詳情可參考:TempData知多少,
Session - ASP.NET MVC中Session是Controller中的一個屬性古徒,Session是HttpSessionStateBase類型拓提。
public HttpSessionStateBase Session { get; }
- Session保存數(shù)據(jù)直到用戶會話結(jié)束(默認(rèn)session過期時間為20mins)。
- Session對所有的請求都有效隧膘,不僅僅是單一的跳轉(zhuǎn)代态。
- 從Session中取值時需要進(jìn)行類型轉(zhuǎn)換和Null Check以避免異常。
Q51. 如何持久化TempData?
Ans. TempData的生命周期十分短暫疹吃,只能存活到目標(biāo)視圖完全加載之后蹦疑。
但是我們可以通過調(diào)用Keep
方法去持久化TempData至下一次訪問。
- void Keep() - 調(diào)用這個方法將保證此次請求之后所有的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) - 調(diào)用這個方法將保證此次請求之后指定的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. 默認(rèn)ASP.NET MVC 支持 session state(會話狀態(tài)). Session用來存儲跨請求
期間的數(shù)據(jù)安聘。 不管你是否在session中存儲數(shù)據(jù)扫沼,ASP.NET MVC都必須為所有的controller管理 session state江掩,且是耗時的 。因此session是存儲在服務(wù)器端的育谬,消耗服務(wù)器的內(nèi)存券盅,所以必然影響你的應(yīng)用程序的性能帮哈。 如果你的某些controller不需要session控制膛檀,可以手動關(guān)閉session控制,來增加微小的性能提升娘侍。
可以通過 session state的配置項來簡化它咖刃。
ASP.NET MVC4中的SessionState
特性中,可以通過指定SessionStateBehavior
枚舉來實現(xiàn)更多對session-state的控制憾筏。
- Default :默認(rèn)的session state控制方式嚎杨。
- Disabled: Session state完全關(guān)閉。
- ReadOnly:只讀的session state氧腰。
- Required:完全的可讀寫的 session state枫浙。
Q53. ASP.NET MVC中 TempData與Session 有什么關(guān)聯(lián)關(guān)系?
Ans. ASP.NET MVC中TempData使用session存儲跨請求的臨時數(shù)據(jù)古拴。因此箩帚,當(dāng)你關(guān)閉了controller的session,當(dāng)你去使用TempData時黄痪,就會拋出以下異常紧帕。
Q54. ASP.NET MVC中什么是Action方法?
Ans. Controller中的action是定義在Controller類中的方法用來執(zhí)行基于用戶請求的操作桅打,并在Model的幫助下將結(jié)果傳遞會View是嗜。
Asp.net MVC 中集成了以下幾種ActionResults類型及對應(yīng)的幫助類方法:
- ViewResult - 使用Controller中提供的
View()
方法返回一個ViewResult用來呈現(xiàn)指定或默認(rèn)的View愈案。 - PartialViewResult- 使用Controller中提供的
PartialView()
方法返回一個PartialViewResult用來呈現(xiàn)指定或默認(rèn)的分部視圖。 - RedirectResult - 使用Controller中提供的
Redirect()
方法返回一個RedirectResult用來發(fā)起一個 HTTP 301 或 302 到指定URL的跳轉(zhuǎn)鹅搪。 - RedirectToRouteResult - 使用Controller中提供的
RedirectToAction(), RedirectToActionPermanent(), RedirectToRoute(), RedirectToRoutePermanent()
方法返回一個RedirectToRouteResult用來發(fā)起一個 HTTP 301或 302 到指定action或者路由的跳轉(zhuǎn)站绪。 - ContentResult - 使用Controller中提供的
Content()
方法返回一個ContentResult用來呈現(xiàn)指定的文本。 - JsonResult - 使用Controller中提供的
Json()
方法返回一個JsonResult用來呈現(xiàn)序列化的Json格式數(shù)據(jù)丽柿。 - JavaScriptResult - 使用Controller中提供的
JavaScript()
方法返回一個JavaScriptResult用來呈現(xiàn)一段JavaScript代碼崇众,一般僅用于Ajax請求的場景。 - FileResult - 使用Controller中提供的
File()
方法返回一個FileResult用來呈現(xiàn)文件(PDF, DOC, Excel等)內(nèi)容航厚。 - EmptyResult - 返回一個空的結(jié)果顷歌。
- HttpNotFoundResult - 使用Controller中提供的
HttpNotFound()
方法返回一個HTTP 404狀態(tài)。 - HttpUnauthorizedResult - 返回一個HttpUnauthorizedResult類型用來表示HTTP 401狀態(tài)(未認(rèn)證)幔睬。用來要求用戶登錄以完成認(rèn)證眯漩。
- HttpStatusCodeResult - 返回 HttpStatusCodeResult用來表示指定Http狀態(tài)。
Q56. ASP.NET MVC中如何標(biāo)記Non-Action方法?
Ans. ASP.NET MVC 將所有的公共方法默認(rèn)為action方法麻顶。
如果不想某個公共的方法被暴露為Action赦抖,僅需要用NonActionAttribute
標(biāo)記方法即可。
[NonAction]
public void DoSomething()
{
// Method logic
}
Q57. 能否更改Action方法的命名辅肾?
Ans. 可以通過ActionName
特性來修改Action的命名队萤。修改后Action將用ActionName
中定義的名稱被調(diào)用。
[ActionName("DoAction")]
public ActionResult DoSomething()
{
//TODO:
return View();
}
這樣,DoSomething
action就會被會被標(biāo)記為DoAction
action矫钓。
Q58. 如何限制action僅能被相應(yīng)的HTTP GET, POST, PUT or DELETE請求訪問?
Ans. 默認(rèn)要尔,每一個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請求調(diào)用概龄。
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();
}