Asp.net mvc 知多少(六)

来源:http://www.cnblogs.com/sheng-jie/archive/2017/02/10/6385845.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 知多少(五)
Asp.net mvc 知多少(六)

本節主要講解模型驗證以及前端的優化技術

Q61. 什麼是ASP.NET MVC中的Data Annotations(數據註解) ?
Ans. Data validation(數據註解)是開發web應用程式的一個關鍵概念。在 Asp.net MVC中我們可以很容易通過將數據註解特性申明到Model類,既可以實現驗證。Data Annotation 特性是位於System.ComponentModel.DataAnnotations命名空間下,適用於Asp.net 項目(比如Asp.net web application & website, Asp.net MVC, Web forms ),同時也適用於Entity framework ORM 模型。
Data Annotations幫助我們為model類或屬性定義規則進行數據驗證和顯示合適的提示信息給終端客戶。
Data Annotation 驗證特性:

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

Q62. Asp.Net MVC如何進行服務端驗證?
Ans. 在與用戶敏感信息交互之前服務端驗證至關重要。不管客戶端是否驗證,我們在服務端都必須進行驗證。用戶可以通過禁用客瀏覽器腳本或採取其他方式來跳過客戶端驗證。在這種情況下,服務端的驗證就必不可少,用來驗證用戶的臟輸入來保證數據安全。
ASP.NET MVC中,在服務端有兩種方式來對model進行驗證:
** Explicit Model Validation (顯示模型驗證)**– 就是使用傳統的 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 (使用數據註解進行模型驗證)** -
Data Annotations (數據註解)是在 .NET 3.5 SP1中引入的. 有一系列的特性類定義在System.ComponentModel.DataAnnotations 程式集。Data Annotations 允許我們使用元數據修飾模型類。這些元數據描述一系列規則來對屬性進行驗證 :

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. 當服務端驗證有錯誤時,錯誤信息將保存在。因此通過使用
ModelState.IsValid 屬性即可驗證model state。

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

Q64. 在ASP.NET MVC中如何關閉和啟用客戶端驗證 ?
Ans. 我們可以通過設置ClientValidationEnabled &
UnobtrusiveJavaScriptEnabled在應用程式級別啟用和關閉客戶端驗證。

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

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

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

我們同時可以為某一view啟用及關閉客戶端驗證。通過在view中的razor代碼塊中指定。view中的設置將覆蓋應用程式級別的設置。

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

Q65. 什麼是CDN以及它有什麼好處?
Ans. CDN代表內容分髮網絡。 它是部署在互聯網上多個數據中心的伺服器分發系統。 它的目的是為了向終端客戶提供高可用性和高性能的內容(比如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>

優點

  1. 減少了客戶端對自己伺服器的請求數。
  2. 節省了帶寬 ,且載入速度快。
  3. 自動緩存,當有一個請求從cdn中獲取資源,後續有相同請求,將直接從緩存中獲取。

Q66. 什麼是 jquery.validate.unobtrusive.js?
Ans. 該插件是從ASP.NET MVC3引入的,通過使用組合的jquery驗證和HTML5數據屬性在客戶端應用數據模型驗證。


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

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

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文件中不必要的字元(比如空格,換號符,製表符)和註釋來減小文件大小來加快網頁載入速度。 有很多種工具進行微小(其中JSMin 和YUI 是最流行的兩款工具) 。
下麵假設我們的頁面中有以下下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>

不使用捆綁和微小,頁面的載入統計

使用捆綁和微小,頁面的載入統計

@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 命名空間提供了用來進行捆綁和微小的技術。引用這個程式集即可在SP.NET MVC3 或 ASP.NET4.0中使用這項技術。


Q69. Bundling(捆綁)是如何使用瀏覽器的緩存能力?
Ans. 瀏覽器緩存資源是基於URLs的。當一個web頁面請求一個資源,瀏覽器首先去檢查它的緩存是否存在資源與請求的URL匹配。如果匹配,則直接使用緩存。
因此無論合適你改變CSS和JS文件它都不會在瀏覽器上有反映。對於這種情形,你需要強制瀏覽器去刷新/載入。
但是捆綁會自動處理這種問題,通過為每一個捆綁添加一個hash code作為url的查詢參數。無論何時你只要改變CSS和JS文件的內容那麼就會產生一個新的hash code,並自動呈現到頁面。這樣,瀏覽器就會看到一個不同的Url,然後就會重新去獲取新的CSS和JS。



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

-Advertisement-
Play Games
更多相關文章
  • 部署環境:VM虛擬機 操作系統:CentOS-6.8-x64 IP地址:192.168.31.91Mysql資料庫版本:5.6.34 Cmake軟體包版本:3.5.2Nginx軟體包版本:1.10.2 PHP軟體包版本:5.6.30 依賴軟體包版本:libiconv-1.14.tar.gz 免費開源 ...
  • 本文主要介紹瞭如何在Linux環境下,在QT中如何引用Shark machine learning library的方法。 ...
  • 為了方便與UCOS對比,順序按照UCOS那篇編寫。 0、一些移植、系統相關 1、框架寫法(個人習慣相關) 1-1、main 函數里創建一個開始任務 1-2、開始任務里,創建我們要運行的多個任務 2、任務創建、掛起、刪除 2-0、相關配置 2-1、任務創建(動態) 2-2、任務掛起 2-3、任務解掛 ...
  • 方法及其簡單,只需要兩步即可: 1、第一步: 打開終端,輸入sudo su命令。 –此處的密碼為普通用戶的密碼,也就是開機時輸入的密碼。 2、第二步: 直接sudo passwd root就重置了roor密碼了。 此時輸入新的密碼即可,個人建議密碼最好字母加數字相結合。 ...
  • 安裝inotify [root@server ~]# mkdir -p /home/oldboy/tools 安裝inotify-tools-3.14.tar.gz [root@server tools]# ls -l /proc/sys/fs/inotify/ #出現下麵三個表示支持inotify... ...
  • 硬碟分區 常識 主分區:最多只能有4個 擴展分區:用於突破主分區最多4個的限制 *最多只能有1個 *主分區+擴展分區最多有4個 *不能寫入數據,只能包含邏輯分區 邏輯分區 格式化:實際是寫入文件系統,文件系統有: Window: FAT16:最大支持2G分區 FAT32:單文件不超過4G,支持16T ...
  • "Linux設備樹語法詳解" 一文中介紹了設備樹的語法,這裡主要介紹內核中提供的操作設備樹的API,這些API通常都在 "include/of.h" 中聲明。 device_node 內核中用下麵的這個結構描述設備樹中的一個節點,後面的API都需要一個device_node對象作為參數傳入。 str ...
  • 平臺匯流排是一種實現設備信息與驅動方法相分離的方法,利用這種方法,我們可以寫出一個更像樣一點的字元設備驅動,即使用cdev作為介面,平臺匯流排作為分離方式: xjkeydrv_init():模塊載入函數 └──platform_driver_register()將驅動對象模塊註冊到平臺匯流排 └──pla ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...