Asp.net mvc 知多少(五)

本系列主要翻譯自《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)的幫助類方法:

  1. ViewResult - 使用Controller中提供的View()方法返回一個ViewResult用來呈現(xiàn)指定或默認(rèn)的View愈案。
  2. PartialViewResult- 使用Controller中提供的PartialView()方法返回一個PartialViewResult用來呈現(xiàn)指定或默認(rèn)的分部視圖。
  3. RedirectResult - 使用Controller中提供的Redirect()方法返回一個RedirectResult用來發(fā)起一個 HTTP 301 或 302 到指定URL的跳轉(zhuǎn)鹅搪。
  4. RedirectToRouteResult - 使用Controller中提供的RedirectToAction(), RedirectToActionPermanent(), RedirectToRoute(), RedirectToRoutePermanent()方法返回一個RedirectToRouteResult用來發(fā)起一個 HTTP 301或 302 到指定action或者路由的跳轉(zhuǎn)站绪。
  5. ContentResult - 使用Controller中提供的Content()方法返回一個ContentResult用來呈現(xiàn)指定的文本。
  6. JsonResult - 使用Controller中提供的Json()方法返回一個JsonResult用來呈現(xiàn)序列化的Json格式數(shù)據(jù)丽柿。
  7. JavaScriptResult - 使用Controller中提供的JavaScript()方法返回一個JavaScriptResult用來呈現(xiàn)一段JavaScript代碼崇众,一般僅用于Ajax請求的場景。
  8. FileResult - 使用Controller中提供的File()方法返回一個FileResult用來呈現(xiàn)文件(PDF, DOC, Excel等)內(nèi)容航厚。
  9. EmptyResult - 返回一個空的結(jié)果顷歌。
  10. HttpNotFoundResult - 使用Controller中提供的HttpNotFound()方法返回一個HTTP 404狀態(tài)。
  11. HttpUnauthorizedResult - 返回一個HttpUnauthorizedResult類型用來表示HTTP 401狀態(tài)(未認(rèn)證)幔睬。用來要求用戶登錄以完成認(rèn)證眯漩。
  12. 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();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市私杜,隨后出現(xiàn)的幾起案子蚕键,更是在濱河造成了極大的恐慌,老刑警劉巖衰粹,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锣光,死亡現(xiàn)場離奇詭異,居然都是意外死亡寄猩,警方通過查閱死者的電腦和手機嫉晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人替废,你說我怎么就攤上這事箍铭。” “怎么了椎镣?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵诈火,是天一觀的道長。 經(jīng)常有香客問我状答,道長冷守,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任惊科,我火速辦了婚禮拍摇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馆截。我一直安慰自己充活,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布蜡娶。 她就那樣靜靜地躺著混卵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窖张。 梳的紋絲不亂的頭發(fā)上幕随,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音宿接,去河邊找鬼赘淮。 笑死,一個胖子當(dāng)著我的面吹牛澄阳,可吹牛的內(nèi)容都是我干的拥知。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼碎赢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了速梗?” 一聲冷哼從身側(cè)響起肮塞,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姻锁,沒想到半個月后枕赵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡位隶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年拷窜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡篮昧,死狀恐怖赋荆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懊昨,我是刑警寧澤窄潭,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站酵颁,受9級特大地震影響嫉你,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躏惋,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一幽污、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧簿姨,春花似錦油挥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贤牛,卻和暖如春惋鹅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殉簸。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工闰集, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人般卑。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓武鲁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蝠检。 傳聞我的和親對象是個殘疾皇子沐鼠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容