Asp.net mvc 知多少(五)

来源:http://www.cnblogs.com/sheng-jie/archive/2017/02/03/6362496.html
-Advertisement-
Play Games

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

  1. ViewResult - 使用Controller中提供的View()方法返回一個ViewResult用來呈現指定或預設的View。
  2. PartialViewResult- 使用Controller中提供的PartialView()方法返回一個PartialViewResult用來呈現指定或預設的分部視圖。
  3. RedirectResult - 使用Controller中提供的Redirect()方法返回一個RedirectResult用來發起一個 HTTP 301 或 302 到指定URL的跳轉。
  4. RedirectToRouteResult - 使用Controller中提供的RedirectToAction(), RedirectToActionPermanent(), RedirectToRoute(), RedirectToRoutePermanent()方法返回一個RedirectToRouteResult用來發起一個 HTTP 301或 302 到指定action或者路由的跳轉。
  5. ContentResult - 使用Controller中提供的Content()方法返回一個ContentResult用來呈現指定的文本。
  6. JsonResult - 使用Controller中提供的Json()方法返回一個JsonResult用來呈現序列化的Json格式數據。
  7. JavaScriptResult - 使用Controller中提供的JavaScript()方法返回一個JavaScriptResult用來呈現一段JavaScript代碼,一般僅用於Ajax請求的場景。
  8. FileResult - 使用Controller中提供的File()方法返回一個FileResult用來呈現文件(PDF, DOC, Excel等)內容。
  9. EmptyResult - 返回一個空的結果。
  10. HttpNotFoundResult - 使用Controller中提供的HttpNotFound()方法返回一個HTTP 404狀態。
  11. HttpUnauthorizedResult - 返回一個HttpUnauthorizedResult類型用來表示HTTP 401狀態(未認證)。用來要求用戶登錄以完成認證。
  12. 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();
}




您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目前只記錄到2個方法: 方法一:導出法 1、右擊需要cp的目錄,點擊export,General/File System 2、next 3、確認你選擇的目錄,並勾選:Create only selected directories 4、選擇導出到那個目錄:To directory 方法二:(沒認證過 ...
  • 一、下載Bot Framework的SDK 首先,下載Bot Framework的SDK,建議下載Bot Framework的Visual Studio的模板Bot Application。 下載下來的模板(不用解壓)請直接放置到C:\Users\你的用戶名\Documents\Visual Stu ...
  • 在進行.netCore時代後,最大的變化就是對Json的使用更加主動,基本代替了之前的XML,像一些用戶配置,系統配置,包包配置等都是基於json的,而web.config這個文件基本變成一個傀儡了,就像大清朝的皇帝一樣!下麵大叔把幾個主要的json文件說一下,和大家一起分享一下這個慈禧太後! pr ...
  • Web TypeScript: the missing introduction Async HTTP API and service bus Optimizing the Performance of Your React Application Redisson PRO vs. Jedis: W... ...
  • 在開源OSS.Social微信項目解析的隨筆中,我簡單給大家分享了進行中微信項目的概要設計,主要在講述解決思路和過程,沒有詳細實現和使用介紹。本著不能馬虎的態度,這篇文章我來給大家分解一下項目結構,使用方式以及後邊的規劃,希望能夠讓大家通達曉暢。同時,當前項目正在進行 .Net Standard 類... ...
  • 本文純屬自己理解著寫的,如果有什麼錯誤或者不全面希望讀者能夠加以補充!~ 1.Web.Config配置文件的節點操作. 2.判斷回發和首次載入. 3.Form標簽中Post和Get的區別 4.當 <form action="LoginHandler.ashx" method="post"> 5.當 ...
  • 起因 在以前項目中,需要給用戶一定提示。設計師建議在滑鼠進入時顯示視窗陰影,離開時取消視窗陰影。 嘗試1 很自然,都會想到直接在視窗的內容或者自定義視窗的最外層元素上加效果。示例如下: <Grid> <Grid.Effect> <DropShadowEffect x:Name="ShadowEffe ...
  • 三層架構簡介: 三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為:界面層(User Interface layer)、業務邏輯層(Business Logic Layer)、數據訪問層(Data access layer)。區分層次的目的即為了“高內聚 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...