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波岛。本書最大的特點是以面試問答的形式進行展開。通讀此書音半,會幫助你對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é)主要講解模型驗證以及前端的優(yōu)化技術(shù)

Q61. 什么是ASP.NET MVC中的Data Annotations(數(shù)據(jù)注解) ?
Ans. Data validation(數(shù)據(jù)注解)是開發(fā)web應(yīng)用程序的一個關(guān)鍵概念。在 Asp.net MVC中我們可以很容易通過將數(shù)據(jù)注解特性申明到Model類彻桃,既可以實現(xiàn)驗證坛善。Data Annotation 特性是位于System.ComponentModel.DataAnnotations命名空間下,適用于Asp.net 項目(比如Asp.net web application & website, Asp.net MVC, Web forms )邻眷,同時也適用于Entity framework ORM 模型眠屎。
Data Annotations幫助我們?yōu)閙odel類或?qū)傩远x規(guī)則進行數(shù)據(jù)驗證和顯示合適的提示信息給終端客戶。
Data Annotation 驗證特性:

  • DataType - 為屬性指定數(shù)據(jù)類型
  • DisplayName - 為屬性指定顯示名稱
  • DisplayFormat - 為屬性指定顯示格式
  • Required - 限制屬性為必錄
  • ReqularExpression - 用正則表達式驗證屬性的值是否滿足要求
  • Range - 限制屬性的值在某一區(qū)間
  • StringLength - 指定string類型屬性的最小和最大長度
  • MaxLength - 指定string類型屬性的最大長度
  • Bind - 添加參數(shù)或表單數(shù)據(jù)到model屬性時肆饶,指定字段將會被添加到或排除
  • ScaffoldColumn - 隱藏表單編輯界面的指定字段

Q62. Asp.Net MVC如何進行服務(wù)端驗證?
Ans. 在與用戶敏感信息交互之前服務(wù)端驗證至關(guān)重要改衩。不管客戶端是否驗證,我們在服務(wù)端都必須進行驗證驯镊。用戶可以通過禁用客瀏覽器腳本或采取其他方式來跳過客戶端驗證葫督。在這種情況下,服務(wù)端的驗證就必不可少板惑,用來驗證用戶的臟輸入來保證數(shù)據(jù)安全橄镜。
ASP.NET MVC中,在服務(wù)端有兩種方式來對model進行驗證:
** Explicit Model Validation (顯示模型驗證)**– 就是使用傳統(tǒng)的 IF..Else..IF 語句對model進行驗證洒放。用這種方式蛉鹿,你需要一個一個的檢查要檢查的屬性。
如果model的屬性是非期望的往湿,在ModelState中插入錯誤信息妖异。

class HomeController : Controller
{
 [HttpPost]
 public ActionResult ExplicitServer(UserViewModel model)
 {
 //Write custom logic to validate UserViewModel
 if (string.IsNullOrEmpty(model.UserName))
 {
 ModelState.AddModelError("UserName", "Please enter your 
name");
 }
 if (!string.IsNullOrEmpty(model.UserName))
 {
 Regex emailRegex = new Regex(".+@.+\\..+");
 if (!emailRegex.IsMatch(model.UserName))
 ModelState.AddModelError("UserName", "Please enter correct 
email address");
 }
 
 if (ModelState.IsValid) //Check model state
 {
 //TO DO:
 }
 }
}

** Model Validation with Data Annotations (使用數(shù)據(jù)注解進行模型驗證)** -
Data Annotations (數(shù)據(jù)注解)是在 .NET 3.5 SP1中引入的. 有一系列的特性類定義在System.ComponentModel.DataAnnotations 程序集。Data Annotations 允許我們使用元數(shù)據(jù)修飾模型類领追。這些元數(shù)據(jù)描述一系列規(guī)則來對屬性進行驗證 :

public class UserViewModel
{
 [Required(ErrorMessage = "Please Enter Email Address")]
 [RegularExpression(".+@.+\\..+", ErrorMessage = "Please Enter Correct 
Email Address")]
 public string UserName { get; set; }
 [Required(ErrorMessage = "Please Enter Password")]
 [StringLength(50, ErrorMessage = "The {0} must be at least {2} 
characters long.", MinimumLength = 6)]
 public string Password { get; set; }
}

Q63. 如何判斷Model State中是否有錯誤他膳?
Ans. 當(dāng)服務(wù)端驗證有錯誤時,錯誤信息將保存在绒窑。因此通過使用
ModelState.IsValid 屬性即可驗證model state棕孙。

[HttpPost]
public ActionResult DoSomething(UserViewModel model)
{
 if (ModelState.IsValid)
 {
 //TODO:
 }
return View();
}

Q64. 在ASP.NET MVC中如何關(guān)閉和啟用客戶端驗證 ?
Ans. 我們可以通過設(shè)置ClientValidationEnabled &
UnobtrusiveJavaScriptEnabled在應(yīng)用程序級別啟用和關(guān)閉客戶端驗證。

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

如果需要開啟客戶端驗證,以上兩個屬性都必須為true蟀俊。
還可以在通過編程在代碼中啟用客戶端驗證钦铺。
修改Global.asax中的Application_Start()事件去啟用關(guān)閉客戶端驗證。

protected void Application_Start()
{
 //Enable or Disable Client Side Validation at Application Level
 HtmlHelper.ClientValidationEnabled = true;
 HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

我們同時可以為某一view啟用及關(guān)閉客戶端驗證肢预。通過在view中的razor代碼塊中指定矛洞。view中的設(shè)置將覆蓋應(yīng)用程序級別的設(shè)置。

@using MvcApp.Models
@{
 ViewBag.Title = "About";
 HtmlHelper.ClientValidationEnabled = false;
}
}

Q65. 什么是CDN以及它有什么好處烫映?
Ans. CDN代表內(nèi)容分發(fā)網(wǎng)絡(luò)沼本。 它是部署在互聯(lián)網(wǎng)上多個數(shù)據(jù)中心的服務(wù)器分發(fā)系統(tǒng)。 它的目的是為了向終端客戶提供高可用性和高性能的內(nèi)容(比如jquery锭沟,bootstrap等開源類庫) 抽兆。
主要由三個流行的cdn:

// Google CDN 
<scripttype="text/javascript"src="http://ajax.googleapis.com/ajax/libs/jquery/1.9
.1/jquery.min.js"></script>
// Microsoft CDN
<scripttype="text/javascript"src="http://ajax.microsoft.com/ajax/jquery/jquery-
1.9.1.min.js"></script>
// JQuery CDN 
<scripttype="text/javascript"src="http://code.jquery.com/jquery-
1.9.1.min.js"></script>

優(yōu)點

  1. 減少了客戶端對自己服務(wù)器的請求數(shù)。
  2. 節(jié)省了帶寬 族淮,且加載速度快辫红。
  3. 自動緩存,當(dāng)有一個請求從cdn中獲取資源祝辣,后續(xù)有相同請求厉熟,將直接從緩存中獲取。

Q66. 什么是 jquery.validate.unobtrusive.js?
Ans. 該插件是從ASP.NET MVC3引入的较幌,通過使用組合的jquery驗證和HTML5數(shù)據(jù)屬性在客戶端應(yīng)用數(shù)據(jù)模型驗證。


Q67. 介紹ASP.NET MVC中的Bundling(捆綁)和Minification (微邪追)?
Ans. ASP.NET MVC4 和.NET Framework 4.5 提供捆綁和微小技術(shù)來減少對服務(wù)器的請求次數(shù)以及減少請求的CSS和JavaScript的大小乍炉,從而加快頁面加載時間。

A bundle是邏輯上的一組文件僅通過一次的http請求就完成加載滤馍。 可以通過調(diào)用BundleCollection類的Add()方法來為CSS和JavaScript來創(chuàng)建 style (樣式)和 script(腳本) bundle (捆綁)岛琼。所有的捆綁都是在
BundleConfig.cs 文件中創(chuàng)建。

public class BundleConfig
{
 public static void RegisterBundles(BundleCollection bundles)
 {
 bundles.Add(new
StyleBundle("~/Content/css").Include("~/Content/site.min.css",
 "~/Content/mystyle.min.css"));
 bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
 "~/Scripts/jquery-1.7.1.min.js",
 "~/Scripts/jquery.validate.min.js",
 "~/Scripts/jquery.validate.unobtrusive.min.js"));
 }
}

Minification是一項用來移除JavaScript和CSS文件中不必要的字符(比如空格巢株,換號符槐瑞,制表符)和注釋來減小文件大小來加快網(wǎng)頁加載速度。 有很多種工具進行微懈蟀(其中JSMin 和YUI 是最流行的兩款工具) 困檩。
下面假設(shè)我們的頁面中有以下下CSS和JavaScript:

<link href="~/Content/Site.css" rel="stylesheet"/>
<link href="~/Content/MyStyle.css" rel="stylesheet"/>
<script src="~/Scripts/jquery-1.7.1.js"></script>
<script src="~/Scripts/jquery-ui-1.8.20.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>

不使用捆綁和微小,頁面的加載統(tǒng)計

使用捆綁和微小那槽,頁面的加載統(tǒng)計

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/jquery")

Q68. 可以在ASP.NET MVC3 或 ASP.NET4.0中使用捆綁和微械垦亍(bundling and minification)嗎?
Ans. Microsoft.Web.Optimization程序集包含的System.Web.Optimization 命名空間提供了用來進行捆綁和微小的技術(shù)骚灸。引用這個程序集即可在SP.NET MVC3 或 ASP.NET4.0中使用這項技術(shù)糟趾。


Q69. Bundling(捆綁)是如何使用瀏覽器的緩存能力?
Ans. 瀏覽器緩存資源是基于URLs的。當(dāng)一個web頁面請求一個資源义郑,瀏覽器首先去檢查它的緩存是否存在資源與請求的URL匹配蝶柿。如果匹配,則直接使用緩存非驮。
因此無論何時你改變CSS和JS文件它都不會在瀏覽器上有反映交汤。對于這種情形,你需要強制瀏覽器去刷新/加載院尔。
但是捆綁會自動處理這種問題蜻展,通過為每一個捆綁添加一個hash code作為url的查詢參數(shù)。無論何時你只要改變CSS和JS文件的內(nèi)容那么就會產(chǎn)生一個新的hash code邀摆,并自動呈現(xiàn)到頁面纵顾。這樣,瀏覽器就會看到一個不同的Url栋盹,然后就會重新去獲取新的CSS和JS施逾。

最后編輯于
?著作權(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
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜜宪,“玉大人虫埂,你說我怎么就攤上這事∑匝椋” “怎么了掉伏?”我有些...
    開封第一講書人閱讀 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)容