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 知多少(三)
本节主要讲解视图引擎及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. 每种视图引擎主要包括以下三个主要部分:
- ViewEngine class - 实现自
IViewEngine
接口;职责是定位视图模板的位置。 - View class - 实现自
IView
接口;职责是从当前的上下文去合并数据与模板并转换为输出的Html标记。 - 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 默认不支持JSONP和CORS。如果有这种需要,就需要做一些编码和配置。
Asp.net mvc 知多少(三)的更多相关文章
- Asp.net mvc 知多少(六)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(七)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(八)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问[http: ...
- Asp.net mvc 知多少(九)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(十)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(一)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(五)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(四)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- Asp.net mvc 知多少(二)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
随机推荐
- css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )
平时在工作中,总是有一些元素之间的边距与设定的边距好像不一致的情况,一直没明白为什么,最近仔细研究了一下,发现里面有学问:垂直元素之间的margin有有互相重叠的情况:新建一个BFC后,会阻止元素与外 ...
- web.xml的启动顺序
1. context-param 2. Listener 3. Filter 4. servlet <?xml version="1.0" encoding="UT ...
- 在XAMPP上建立多个域名的站点
XAMPP默认安装完毕后,站点文件默认放在/xampp/htdocs/ 文件下,并且可以通过http://localhost 进行访问.先前在测试各种程序的时候均是在/xampp/htdocs/ 文件 ...
- Linux的iptables常用配置范例(1)
以下是来自 http://wiki.ubuntu.org.cn/IptablesHowTo 上的配置说明 可以通过/sbin/iptables -F清除所有规则来暂时停止防火墙: (警告:这只适合在没 ...
- ZooKeeper 的安装和配置---单机和集群
如题本文介绍的是ZooKeeper 的安装和配置过程,此过程非常简单,关键是如何应用(将放在下节及相关节中介绍). 单机安装.配置: 安装非常简单,只要获取到 Zookeeper 的压缩包并解压到某个 ...
- 函数之局部变量和使用global语句
局部变量当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的.这称为变量的 作用域 .所有变量的作用域是它们被定义的块,从它们的名称被定义 ...
- Bestcoder #80
首先吐槽一下,ca爷出的这套题到处都是坑,bestcoder变成besthack,Ranting已经掉得不能看了 A题: 链接:http://acm.hdu.edu.cn/showproblem.ph ...
- MySQL的IP处理函数inet_aton()和inet_ntoa()
给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> SELECT inet_aton ...
- 2016年最全面的VR资源盘点,不只有VR视频播放器还有具体到步骤的VR资源
2016年过去了,有多少人开始使用VR来观看我们喜欢的视频资源呢?比传统视频更高的沉浸感,甚至在VR眼镜的视角中,自己仿佛化生成视频中的主角一般.然而,这种体验只有VR眼镜还是不行的,还需要有一个VR ...
- ireport 取消自动分页,detail不分页,当没有数据的时候显示title
报表文件属性页面 lgnore pagination 勾选上,就可以取消分页功能.