本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》 By Shailendra Chauhan,想看英文原版的可訪問 "http://www.dotnettricks.com/free ebooks" 自行下載。該書主要分為兩部分,ASP.N ...
本系列主要翻譯自《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 知多少(五)
本節主要講解幾種頁面傳值方式和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();
}