专栏首页圣杰的专栏Asp.net mvc 知多少(三)

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

本节主要讲解视图引擎及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与业务逻辑紧耦合(.aspx,.aspx.cs)

View与业务逻辑分离

@ 符号书写方式@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。如果有这种需要,就需要做一些编码和配置。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DDD理论学习系列(1)-- 通用语言

    1.引言 在开始之前,我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗,就像我们面向对象编程一样,那通用语言面向的是? DDD的主要参与者:...

    圣杰
  • ABP入门系列(8)——Json格式化

    讲完了分页功能,这一节我们先不急着实现新的功能。来简要介绍下Abp中Json的用法。为什么要在这一节讲呢?当然是做铺垫啊,后面的系列文章会经常和Json这个东...

    圣杰
  • Orleans 知多少 | 2. 核心概念一览

    上面已经提到,Grain是Virtual Actor的具体表现。那如何理解Grain呢。

    圣杰
  • 为什么DevOps和云计算在一起至关重要

    软件的定义特性是软性的。举个例子,将翻盖手机与智能手机进行对比。如果想改变翻盖手机按键的颜色,由于按键是一个实体塑料件,这将需要更改其制造过程。从提出想法到市场...

    静一
  • Stack Overflow发布2018年度开发者调查报告,从中我们发现…

    ? 作者 Quincy Larson 编译 Mika 本文为 CDA 数据分析师原创作品,转载需授权 上周Stack Overflow发布了2018年度开...

    CDA数据分析师
  • 全中!七大初学者易踩的坑!

    英国作家奥斯卡·王尔德曾说过,人们给自己犯过的错误取名叫做经验。因此可想而知,经验不足的开发人员在编程道路上还有很多未曾踩过的坑。在本文中,我会给你讲讲一些大多...

    攻城狮的那点事
  • 优秀软件开发人员的态度

    软件开发是一门艺术,而不仅仅是一门科学。您可以了解软件开发的所有技术细节,但您需要对编码充满热情,并将其视为一种非常擅长的艺术。如果你是这样的人,我将向你介绍成...

    FunTester
  • 【企示录】不重视码农和开发者,企业将每年损失3000亿美元!

    尽管如此,许多公司仍旧滥用着这些最为宝贵的“资源”,很多开发人员的工作被限定在维护破旧系统或者软件,这项任务每年的耗费高达3000亿美元,而其中,仅仅在老旧代码...

    新智元
  • 写了15年代码,我终于总结出提升10倍效率的三件事

    我们许多人开始编程的时候都有特定的目的。比如,我开始编程的时候,是让我能在睡觉和在学校的时候自动玩那个文字版的MUD游戏。我那时候是个写脚本的13岁小孩,甚至不...

    华章科技
  • 三件事让你成为效率高的程序员

    沈唁

扫码关注云+社区

领取腾讯云代金券