本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可訪問(wèn)http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分,ASP.NET MVC 5、ASP.NET WEB API2。本書最大的特點(diǎn)是以面試問(wèn)答的形式進(jìn)行展開(kāi)。通讀此書,會(huì)幫助你對(duì)ASP.NET MVC有更深層次的理解。
由于個(gè)人技術(shù)水平和英文水平也是有限的,因此錯(cuò)誤在所難免,希望大家多多留言指正。
系列導(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àn)證以及前端的優(yōu)化技術(shù)
Q61. 什么是ASP.NET MVC中的Data Annotations(數(shù)據(jù)注解) ?
Ans. Data validation(數(shù)據(jù)注解)是開(kāi)發(fā)web應(yīng)用程序的一個(gè)關(guān)鍵概念。在 Asp.net MVC中我們可以很容易通過(guò)將數(shù)據(jù)注解特性申明到Model類,既可以實(shí)現(xiàn)驗(yàn)證。Data Annotation 特性是位于System.ComponentModel.DataAnnotations命名空間下,適用于Asp.net 項(xiàng)目(比如Asp.net web application & website, Asp.net MVC, Web forms ),同時(shí)也適用于Entity framework ORM 模型。
Data Annotations幫助我們?yōu)閙odel類或?qū)傩远x規(guī)則進(jìn)行數(shù)據(jù)驗(yàn)證和顯示合適的提示信息給終端客戶。
Data Annotation 驗(yàn)證特性:
- DataType - 為屬性指定數(shù)據(jù)類型
- DisplayName - 為屬性指定顯示名稱
- DisplayFormat - 為屬性指定顯示格式
- Required - 限制屬性為必錄
- ReqularExpression - 用正則表達(dá)式驗(yàn)證屬性的值是否滿足要求
- Range - 限制屬性的值在某一區(qū)間
- StringLength - 指定string類型屬性的最小和最大長(zhǎng)度
- MaxLength - 指定string類型屬性的最大長(zhǎng)度
- Bind - 添加參數(shù)或表單數(shù)據(jù)到model屬性時(shí),指定字段將會(huì)被添加到或排除
- ScaffoldColumn - 隱藏表單編輯界面的指定字段
Q62. Asp.Net MVC如何進(jìn)行服務(wù)端驗(yàn)證?
Ans. 在與用戶敏感信息交互之前服務(wù)端驗(yàn)證至關(guān)重要。不管客戶端是否驗(yàn)證,我們?cè)诜?wù)端都必須進(jìn)行驗(yàn)證。用戶可以通過(guò)禁用客瀏覽器腳本或采取其他方式來(lái)跳過(guò)客戶端驗(yàn)證。在這種情況下,服務(wù)端的驗(yàn)證就必不可少,用來(lái)驗(yàn)證用戶的臟輸入來(lái)保證數(shù)據(jù)安全。
ASP.NET MVC中,在服務(wù)端有兩種方式來(lái)對(duì)model進(jìn)行驗(yàn)證:
** Explicit Model Validation (顯示模型驗(yàn)證)**– 就是使用傳統(tǒng)的 IF..Else..IF 語(yǔ)句對(duì)model進(jìn)行驗(yàn)證。用這種方式,你需要一個(gè)一個(gè)的檢查要檢查的屬性。
如果model的屬性是非期望的,在ModelState中插入錯(cuò)誤信息。
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ù)注解進(jìn)行模型驗(yàn)證)** -
Data Annotations (數(shù)據(jù)注解)是在 .NET 3.5 SP1中引入的. 有一系列的特性類定義在System.ComponentModel.DataAnnotations 程序集。Data Annotations 允許我們使用元數(shù)據(jù)修飾模型類。這些元數(shù)據(jù)描述一系列規(guī)則來(lái)對(duì)屬性進(jìn)行驗(yàn)證 :
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中是否有錯(cuò)誤?
Ans. 當(dāng)服務(wù)端驗(yàn)證有錯(cuò)誤時(shí),錯(cuò)誤信息將保存在。因此通過(guò)使用
ModelState.IsValid 屬性即可驗(yàn)證model state。
[HttpPost]
public ActionResult DoSomething(UserViewModel model)
{
if (ModelState.IsValid)
{
//TODO:
}
return View();
}
Q64. 在ASP.NET MVC中如何關(guān)閉和啟用客戶端驗(yàn)證 ?
Ans. 我們可以通過(guò)設(shè)置ClientValidationEnabled &
UnobtrusiveJavaScriptEnabled在應(yīng)用程序級(jí)別啟用和關(guān)閉客戶端驗(yàn)證。
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
如果需要開(kāi)啟客戶端驗(yàn)證,以上兩個(gè)屬性都必須為true。
還可以在通過(guò)編程在代碼中啟用客戶端驗(yàn)證。
修改Global.asax中的Application_Start()事件去啟用關(guān)閉客戶端驗(yàn)證。
protected void Application_Start()
{
//Enable or Disable Client Side Validation at Application Level
HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
我們同時(shí)可以為某一view啟用及關(guān)閉客戶端驗(yàn)證。通過(guò)在view中的razor代碼塊中指定。view中的設(shè)置將覆蓋應(yīng)用程序級(jí)別的設(shè)置。
@using MvcApp.Models
@{
ViewBag.Title = "About";
HtmlHelper.ClientValidationEnabled = false;
}
}
Q65. 什么是CDN以及它有什么好處?
Ans. CDN代表內(nèi)容分發(fā)網(wǎng)絡(luò)。 它是部署在互聯(lián)網(wǎng)上多個(gè)數(shù)據(jù)中心的服務(wù)器分發(fā)系統(tǒng)。 它的目的是為了向終端客戶提供高可用性和高性能的內(nèi)容(比如jquery,bootstrap等開(kāi)源類庫(kù)) 。
主要由三個(gè)流行的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)點(diǎn)
- 減少了客戶端對(duì)自己服務(wù)器的請(qǐng)求數(shù)。
- 節(jié)省了帶寬 ,且加載速度快。
- 自動(dòng)緩存,當(dāng)有一個(gè)請(qǐng)求從cdn中獲取資源,后續(xù)有相同請(qǐng)求,將直接從緩存中獲取。
Q66. 什么是 jquery.validate.unobtrusive.js?
Ans. 該插件是從ASP.NET MVC3引入的,通過(guò)使用組合的jquery驗(yàn)證和HTML5數(shù)據(jù)屬性在客戶端應(yīng)用數(shù)據(jù)模型驗(yàn)證。
Q67. 介紹ASP.NET MVC中的Bundling(捆綁)和Minification (微?。?
Ans. ASP.NET MVC4 和.NET Framework 4.5 提供捆綁和微小技術(shù)來(lái)減少對(duì)服務(wù)器的請(qǐng)求次數(shù)以及減少請(qǐng)求的CSS和JavaScript的大小,從而加快頁(yè)面加載時(shí)間。
A bundle是邏輯上的一組文件僅通過(guò)一次的http請(qǐng)求就完成加載。 可以通過(guò)調(diào)用BundleCollection類的Add()方法來(lái)為CSS和JavaScript來(lái)創(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是一項(xiàng)用來(lái)移除JavaScript和CSS文件中不必要的字符(比如空格,換號(hào)符,制表符)和注釋來(lái)減小文件大小來(lái)加快網(wǎng)頁(yè)加載速度。 有很多種工具進(jìn)行微?。ㄆ渲蠮SMin 和YUI 是最流行的兩款工具) 。
下面假設(shè)我們的頁(yè)面中有以下下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>
不使用捆綁和微小,頁(yè)面的加載統(tǒng)計(jì)

使用捆綁和微小,頁(yè)面的加載統(tǒng)計(jì)
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/jquery")

Q68. 可以在ASP.NET MVC3 或 ASP.NET4.0中使用捆綁和微?。╞undling and minification)嗎?
Ans. Microsoft.Web.Optimization程序集包含的System.Web.Optimization 命名空間提供了用來(lái)進(jìn)行捆綁和微小的技術(shù)。引用這個(gè)程序集即可在SP.NET MVC3 或 ASP.NET4.0中使用這項(xiàng)技術(shù)。
Q69. Bundling(捆綁)是如何使用瀏覽器的緩存能力?
Ans. 瀏覽器緩存資源是基于URLs的。當(dāng)一個(gè)web頁(yè)面請(qǐng)求一個(gè)資源,瀏覽器首先去檢查它的緩存是否存在資源與請(qǐng)求的URL匹配。如果匹配,則直接使用緩存。
因此無(wú)論何時(shí)你改變CSS和JS文件它都不會(huì)在瀏覽器上有反映。對(duì)于這種情形,你需要強(qiáng)制瀏覽器去刷新/加載。
但是捆綁會(huì)自動(dòng)處理這種問(wèn)題,通過(guò)為每一個(gè)捆綁添加一個(gè)hash code作為url的查詢參數(shù)。無(wú)論何時(shí)你只要改變CSS和JS文件的內(nèi)容那么就會(huì)產(chǎn)生一個(gè)新的hash code,并自動(dòng)呈現(xiàn)到頁(yè)面。這樣,瀏覽器就會(huì)看到一個(gè)不同的Url,然后就會(huì)重新去獲取新的CSS和JS。