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 知多少(十)

本节主要讲解视图引擎及HtmlHelper的使用

Q24. ASP.NET MVC中主要的命名空间有哪些?
Ans. 主要有以下三个比较重要的命名空间:

  • System.Web.Mvc - 此命名空间包含类和接口是为了支持ASP.NET Web应用程序的Mvc模式。主要包括:Controllers、Controller factories、action results、views、partial views、model binders。
  • System.Web.Mvc.Ajax - 支持Ajax脚本。此命名空间主要是为了支持Ajax脚本已经Ajax选项设置。
  • System.Web.Mvc.Html – 此命名空间帮忙渲染HTML控件。主要用来支撑 forms, input controls, links, partial views,
    validation.

Q25. 什么是视图引擎?
Ans. 视图引擎作为mvc的子系统拥有自身的语义标记。它的职责是转换服务器模板为html标记并渲染呈现到浏览器。最初,ASP.mvc只有一种视图引擎web forms(aspx) ,从ASP.NET MVC3 引入了新的Razor视图引擎。除此之外,还有 Spark, NHaml 等第三方视图引擎。


Q26. 视图引擎是怎样工作的?
Ans. 每种视图引擎主要包括以下三个主要部分:

  1. ViewEngine class - 实现自IViewEngine接口;职责是定位视图模板的位置。
  2. View class - 实现自IView 接口;职责是从当前的上下文去合并数据与模板并转换为输出的Html标记。
  3. Template parsing engine (模板解析引擎)- 解析模板和编译视图为可执行代码。

Q27. 介绍下Razor视图引擎?
Ans. Razor引擎是从MVC3引入的一种高级视图引擎。Razor不是一种新的语言而是一种新的标记语义。 Razor提供的语义减少用户输入且富于表现力。相较于Web From 语义更加简洁且容易学习。Razor使用@符号去书写标记。@Html.ActionLink("SignUp", "SignUp")


Q28. 如何自定义视图引擎?
Ans. ASP.NET MVC 是一个开源并且高度可扩展的框架。可以通过实现IViewEngine 接口或者继承 VirtualPathProviderViewEngine 抽象类来实现自定义视图引擎。


public class CustomViewEngine : VirtualPathProviderViewEngine
{
 public CustomViewEngine()
 {
 // Define the location of the View and Partial View
 this.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.html",
"~/Views/Shared/{0}.html" };
 this.PartialViewLocationFormats = new string[] { "~/Views/{1}/{0}.html",
"~/Views/Shared/{0}.html" };
 }
 protected override IView CreatePartialView(ControllerContext
controllerContext, string partialPath)
 {
 var physicalpath =
controllerContext.HttpContext.Server.MapPath(partialPath);
 return new CustomView(physicalpath);
 }
 protected override IView CreateView(ControllerContext controllerContext,
string viewPath, string masterPath)
 {
 var physicalpath =
controllerContext.HttpContext.Server.MapPath(viewPath);
 return new CustomView(physicalpath);
 }
}
public class CustomView : IView
{
 private string _viewPhysicalPath;
 public CustomView(string ViewPhysicalPath)
 {
 _viewPhysicalPath = ViewPhysicalPath;
 }
 public void Render(ViewContext viewContext, System.IO.TextWriter writer)
{
 //Load File
 string rawcontents = File.ReadAllText(_viewPhysicalPath);
 //Perform Replacements
 string parsedcontents = Parse(rawcontents, viewContext.ViewData);
 writer.Write(parsedcontents);
 }
 public string Parse(string contents, ViewDataDictionary viewdata)
 {
 return Regex.Replace(contents, "\\{(.+)\\}", m => GetMatch(m, viewdata));
 }
 public virtual string GetMatch(Match m, ViewDataDictionary viewdata)
 {
 if (m.Success)
 {
 string key = m.Result("$1");
 if (viewdata.ContainsKey(key))
 {
 return viewdata[key].ToString();
 }
 }
 return string.Empty;
 }
}


Q29. 如何注册自定义视图引擎?
Ans. 通过在global.asax.cs文件的Application_Start()方法注册自定义视图引擎,来告诉ASP.NET MVC来使用自定义视图引擎替换默认的视图引擎。

protected void Application_Start()
{
 //Register Custom View Engine
 ViewEngines.Engines.Add(new CustomViewEngine());

 //other code is removed for clarity
}

Q30. 能否删除默认的视图引擎?
Ans. 当然可以删除微软提供达到默认搜索引擎,Razor和Web Froms(aspx)。

protected void Application_Start()
{
 //Remove All View Engine including Webform and Razor
 ViewEngines.Engines.Clear();
}

Q31. Razor和WebForm 引擎的主要区别有哪些?

Razor WebForm
MVC3后引入 最初的MVC版本就引入
位于System.Web.Razor命名空间 位于System.Web.Mvc.WebFormViewEngine命名空间
状态管理技术(View State、Session) 没有自动的状态管理
基于文件路径的路由 基于路由的Urls
统一的文件后缀 .cshtml(C#) 视图后缀为.aspx,分部视图或编辑模板为.ascx
View与业务逻辑分离 View与业务逻辑紧耦合(.aspx,.aspx.cs)
@ 符号书写方式@Html.ActionLink("SignUp", "SignUp") <%: Html.ActionLink("SignUp", "SignUp") %>
默认支持阻止XSS攻击 不支持
不能通过拖拽控件进行布局 可以
支持TDD 不支持TDD

Q33. 列举下都有哪几种HTML Helpers?
Ans. 主要有三种Html Helpers:
1、** Inline Html Helpers **- 通过Razor@helper标签创建的帮助类,只能在同一个view中使用。

@helper ListingItems(string[] items)
{
 <ol>
 @foreach (string item in items)
 {
 <li>@item</li>
 }
 </ol>
}
<h3>Programming Languages:</h3>
@ListingItems(new string[] { "C", "C++", "C#" })
<h3>Book List:</h3>
@ListingItems(new string[] { "How to C", "how to C++", "how to C#" })

2、 Built-In Html Helpers - Built-In Html Helpers 是针对HtmlHelper的扩展方法。主要分为三类:

2.1 Standard Html Helpers - 用于渲染常见的Html 元素:

2.2 Strongly Typed HTML Helpers - 基于model属性创建的html元素,主要是通过lambda表达式来创建元素。

2.3 **Templated HTML Helpers ** - 该类型帮助类,会自动根据model类的属性类型去呈现适当的html元素。
比如你的属性使用[DataType(DataType.Password)]属性注解为Password,那么使用模板html帮助类,它将自动呈现为密码类型的文本框。<input id="Password" name="Password" type="password"/>

Display and DisplayFor:根据指定的model属性和基于model属性的数据类型和元数据选择一个合适的html标签去渲染【只读状态的视图】
Editor and EditorFor:根据指定的model属性和基于model属性的数据类型和元数据选择一个合适的html标签去渲染【编辑状态的视图】

3、 Custom Html Helpers - 可以通过扩展HtmlHelper类或者通过创建在工具类中创建静态方法来创建自定义Html Helper。

public static class CustomHelpers
{
 //Submit Button Helper
 public static MvcHtmlString SubmitButton(this HtmlHelper helper, string buttonText)
 {
 string str = "<input type=\"submit\" value=\"" + buttonText + "\"/>";
 return new MvcHtmlString(str);
 }
 //Readonly Strongly-Typed TextBox Helper
 public static MvcHtmlString TextBoxFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel,TValue>>expression, bool isReadonly)
 {
 MvcHtmlString html = default(MvcHtmlString);
 if (isReadonly)
 {
 html = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, new { @class = "readOnly", @readonly = "read-only" });
 }
 else
 {
 html = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression);
 }
 return html;
 }
}

Q34. 介绍下Url Helpers?
Ans. Url helpers 基于路由配置帮助我们去渲染HTML链接或生成URL。



Q35. 什么是 Validation Summary(验证汇总)?
Ans. ValidationSummary是用来显示ModelState字典中所有验证错误信息 (未经排序)。它接收一个bool参数,当@Html.ValidationSummary(true)显示model-level错误;当 @Html.ValidationSummary(false)显示model-level 和 property-level 错误。
假设你在代码中添加了如下两行代码:

ModelState.AddModelError("", "This is Model-level error!");
ModelState.AddModelError("Name", "This Model property-level error!");

第一行未指定key关联这个错误信息;第二行指定Name属性关联。
当在view中分别使用以下两种方式现在验证信息:

@Html.ValidationSummary(true) @*//shows model-level errors*@
@Html.ValidationSummary(false) @*//shows model-level and property-level errors*@

因此,为true时,只显示model级别错误信息。
为false时,即显示model级别,也显示model的属性级别的错误。


Q36. 介绍下 AJAX Helpers?
Ans. AJAX Helpers 是用来创建启用Ajax进行异步加载的元素比如Ajax From,Ajax 链接。 AJAX Helpers 是System.Web.Mvc命名空间中AJAXHelper类的扩展方法。

@Ajax.ActionLink("Load Products", "GetProducts", new AjaxOptions {UpdateTargetId= "Products-container", HttpMethod = "GET" })

//输出:
<a data-ajax="true" data-ajax-method="GET" data-ajax-mode="replace" 
data-ajax-update="#Products-container" href="/Home/GetProducts">Load Products</a>

Q37.什么是非侵入Ajax (unobtrusive AJAX)?
Ans. ASP.NET MVC提供了基于jquery的非侵入ajax。非侵入式ajax意味着通过使用帮助类方法去定义ajax功能而不是通过在view中添加js代码块。


Q38. 介绍下AJAX帮助类的配置选项?
Ans. AjaxOptions类定义的属性允许你在ajax请求的生命周期中的不同阶段指定对应的回调方法。关于AjaxOptions的配置项讲解,详参Ajax.BeiginForm()知多少


Q39. 什么是Cross Domain AJAX(跨域Ajax)?
Ans. 默认来说,浏览器只允许ajax调用你自己服务器上托管的当前web应用的站点。这个限制帮助组长了许多安全问题(比如XSS攻击)。但是,有些时候我们需要与额外的API(s)交互比如(Twitter或者Google)。因此,为了与额外的API(s)进行交互,我们的web应用就必须支持JSONP请求或CORS(跨域资源分享)。ASP.NET MVC 默认不支持JSONPCORS。如果有这种需要,就需要做一些编码和配置。

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

推荐阅读更多精彩内容