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有更深层次的理解。
由于个人技术水平和英文水平也是有限的,因此错误在所难免,希望大家多多留言指正。
系列导航
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 知多少(十)

本节主要讲解模型验证以及前端的优化技术

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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容