ASP.NET(十一)--ASP.NET MVC Action的參數

關於Action的參數

ASP.Net MVC會自動對參數做類型轉換;
對於boolean類型的參數(或者Model的屬性),如果使用checkbox,則value必須是"true",否則值永遠是false。對於double、int等類型會自動進行類型轉換。

1、Action

一個Controller可以有多個方法,這些方法叫Action。通過“Controller名字/方法名”訪問的時候就會執行對應的方法。

2、三種類型的參數

Action的三種類型的參數:普通參數、Model類、FormCollection。

  1. 普通參數:Index(string name,int age)。框架會自動把用戶請求的QueryString或者Post表單中的值根據參數名字映射對應參數的值,適用於查詢參數比較少的情況。int的可空問題。
  2. Model類。這種類叫ViewModel。
  3. FormCollection,採用fc[“name”]這種方法訪問,類似於HttpHandler中用ctx [“name”]。適用於表單元素不確定、動態的情況。

3、Action的方法

Action的方法不能重載,所以如果一個Controller中不能同時存在這兩個Action:public ActionResult T1(string name);public ActionResult T1(int age)
特殊情況:給Action方法上標註[HttpGet]、[HttpPost],這樣當發出Get請求的時候執行標註[HttpGet]的Action方法,當發出Post請求的時候執行標註[HttpPost]的Action方法。沒有標註的,常見的應用:標註[HttpGet]的Action展示初始頁面,標註[HttpPost]的Action處理表單提交請教。案例:做一個報名頁面。

4、Action參數

Action參數可以一部分普通參數,一部分Model;

Action參數如果在請求中沒有對應的值,則Model類的形式則取默認值:數字是0、boolean是false、引用類型是null。如果是普通參數的形式:會報錯,如果允許爲空,要使用int?。可以使用C#的可選參數語法來設定默認值。Index(string name=“tom”);

5、上傳文件

上傳文件的參數用HttpPostedFileBase類型,注意不是HttpPostedFile類型;

View的查找

  1. return View()會查找Views的Controller名字的Action的名字的cshtml;
  2. return View(“Action1”),查找Views的Controller名字下的“Action1.cshtml”,如果找不到則到特殊的Shared文件夾下找“Action1.cshtml”
  3. return View(“Action1”)中如何傳遞model?return View(“Action1”,model)。陷阱:如果model傳遞的是string類型,則需要return View(“Action1”,(object)str)爲什麼?看一下重載!

注意return View(“Action1”)不是重定向,瀏覽器和服務器之間只發生了一次交互,地址欄還是舊的Action的地址。這和重定向return Redirct("/Index/Action1");不一樣

應用:執行報錯,return View(“Error”,(object)msg) 通用的報錯頁面。爲了防止忘了控制重載,封裝成一個通用方法。

其他類型的ActionResult

  1. View()是一個方法,它的返回值是ViewResult類型,ViewResult繼承自ActionResult,如果你確認返回的是View(),返回值寫成ViewResult也行,但是一般沒這個必要,因爲那樣就不靈活了。因爲ViewResult還有其他子類。

  2. RedirectResult,重定向,最終就是調用response.Redirect()。用法:return Redirect(“http://www.yltedu.com”); return Redirect("~/1.html");

  3. ContentResult(用得少)返回程序中直接拼接生成的文本內容。ContentResult Content(string content, string contentType)

  4. 文件

    • FileContentResult File(byte[] fileContents, string contentType) 返回byte[]格式的數據
    • FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName):fileDownloadName設定瀏覽器端彈出的保存建議的文件名。
    • FileStreamResult File(Stream fileStream, string contentType) 返回Stream類型的數據(框架會幫着Dispose,不用也不能Dispose)
    • FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName)
    • FilePathResult File(string fileName, string contentType) 返回文件名指定的文件,內部還是流方式讀取文件;
    • FilePathResult File(string fileName, string contentType, string fileDownloadName)、
    • 如果是返回動態生成的圖片(比如驗證碼),則不用設置fileDownloadName;如果是“導出學生名單”、“下載文檔”等操作則要設定fileDownloadName。
    • 注意:如果在Controller中要使用System.IO下的File類,因爲和File方法重名了,所以要用命名空間來引用了。
  5. 404HttpNotFoundResult HttpNotFound()

  6. JavaScriptResult JavaScript(string script)(用得少)返回JavaScript代碼字符串,和return Content(“alert(‘Hello World!’);”, “application/x-javascript”);效果是一樣的。因爲違反分層的原則,儘量不要用。

  7. JsonJsonResult Json(object data) 把data對象序列化成json字符串返回給客戶端,並且設置contentType爲"application/json"。Json方法默認是禁止Get請求的(主要爲了防止CSRF攻擊,舉例:在A網站中嵌入一個請求銀行網站給其他賬號轉賬的Url的img),只能Post請求。所以如果以Get方式訪問是會報錯的。如果確實需要以Get方式方式,需要調用return Json(data, JsonRequestBehavior.AllowGet)

  8. ASP.net MVC默認的Json方法實現由如下的缺點:

    • 日期類型的屬性格式化成的字符串是"/Date(1487305054403)/"這樣的格式,在客戶端要用js代碼格式化處理,很麻煩。
    • json字符串中屬性的名字和C#中的大小寫一樣,不符合js中“小寫開頭、駝峯命名”的習慣。在js中也要用大寫去處理。
    • 無法處理循環引用的問題(儘管應該避免循環引用),會報錯“序列化類型爲***的對象時檢測到循環引用”
  9. 重定向:

    • Redirect(string url)
    • RedirectToAction(string actionName, string controllerName):其實就幫助拼接生成url,最終還是調用Redirect(),個人不喜歡RedirectToAction,“少即是多”。注意別調錯了重載。
    • RedirectToAction和return View的區別:RedirectToAction是讓客戶端重定向,是一個新的Http請求,所以無法讀取ViewBag中的內容;return View()是一次服務器一次處理中的轉移。

Redirect和return View 的區別:

  1. Redirect是讓瀏覽器重定向到新的地址;return View是讓服務器把指定的cshtml的內容運行渲染後給到瀏覽器;
  2. Redirect瀏覽器和服務器之間發生了兩次交互;return View瀏覽器和服務器之間發生了1次交互
  3. Redirect由於是兩次請求,所以第一次設置的ViewBag等這些信息,在第二次是取不到;而View則是在同一個請求中,所以ViewBag信息可以取到。
  4. 如果用Redirect,則由於是新的對Controller/Action的請求,所以對應的Action會被執行到。如果用View,則是直接拿某個View去顯示,對應的Action是不執行的。
  5. 什麼情況用View?服務器端產生數據,想讓一個View去顯示的;
  6. 什麼情況用Redirect?讓瀏覽器去訪問另外一個頁面的時候。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章