本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan爬范,想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載财著。該書主要分為兩部分侧巨,ASP.NET MVC 5纱新、ASP.NET WEB API2奢驯。本書最大的特點(diǎn)是以面試問答的形式進(jìn)行展開适掰。通讀此書,會(huì)幫助你對(duì)ASP.NET MVC有更深層次的理解塑煎。
由于個(gè)人技術(shù)水平和英文水平也是有限的沫换,因此錯(cuò)誤在所難免,希望大家多多留言指正轧叽。
系列導(dǎo)航
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 知多少(十)
本節(jié)主要講解布局頁(Layout)的使用
Q40. 什么是 ASP.NET MVC的布局頁(Layouts)?
Ans. Layouts(布局頁)是用來使asp.net mvc中的views保持一致的外觀體驗(yàn)苗沧。與webforms的master pages功能相似刊棕,但比其更加簡(jiǎn)單且可擴(kuò)展性更強(qiáng)炭晒。下面是一個(gè)布局頁的代碼展示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
@RenderBody()
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
</body>
</html>
可以使用layout為你的網(wǎng)站定義一個(gè)通用的模板待逞。layout可以直接在view的頂部直接聲明:
@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
}
Q41. 介紹下ASP.NET MVC中Sections(節(jié))?
Ans. 通過section可以在layout中指定占用一塊內(nèi)容區(qū)域⊥希可以在view中按以下方式定義section识樱。
@section header{
<h1>Header Content</h1>
}
在layout中通過@RenderSection("header")去渲染上面定義的section。
默認(rèn)來說震束,如果在layout中定義了需要渲染的section怜庸,那么在view中就必須實(shí)現(xiàn)。但可以通過以下方式垢村,限定section是可選的割疾。@RenderSection("header",false)
備注:View只能定義已經(jīng)在layout中指定渲染的section,否則會(huì)拋出異常嘉栓。
Q42. RenderBody 和 RenderPage 的作用是?
Ans. RenderBody 方法是在layout頁面中調(diào)用的宏榕,是用來渲染呈現(xiàn)子頁面/視圖。它類似于webform引擎中master頁中的ContentPlaceHolder侵佃。一個(gè)layout頁面中只能有一個(gè) RenderBody 方法麻昼。
<body>
@RenderBody()
@RenderPage("~/Views/Shared/_Header.cshtml")
@RenderPage("~/Views/Shared/_Footer.cshtml")
@RenderSection("scripts",false)
@section scripts{
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
}
</body>
RenderPage 方法也是在layout頁面中用來渲染加應(yīng)用程序中的其他頁面。一個(gè)layout頁面中可以有多個(gè)RenderPage 方法馋辈。
@RenderPage("~/Views/Shared/_Header.cshtml");
Q43. Styles.Render 和Scripts.Render的功能是?
Ans. 它們是用來捆綁多個(gè)css文件和js文件抚芦,以提高網(wǎng)絡(luò)加載速度和頁面解析速度。Style.Render是用來呈現(xiàn)定義在BundleConfig.cs中捆綁的css文件迈螟。 Styles.Render為捆綁的css創(chuàng)建style標(biāo)簽叉抡。
Scripts.Render 也是用來呈現(xiàn)捆綁的script文件。它會(huì)為捆綁的script文件創(chuàng)建script標(biāo)簽答毫。
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.unobtrusive*",
"~/Scripts/jquery.validate*"));
bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
"~/Content/themes/base/jquery.ui.core.css",
"~/Content/themes/base/jquery.ui.resizable.css",
"~/Content/themes/base/jquery.ui.selectable.css",
"~/Content/themes/base/jquery.ui.button.css",
"~/Content/themes/base/jquery.ui.dialog.css",
"~/Content/themes/base/jquery.ui.theme.css"));
}
當(dāng)關(guān)閉優(yōu)化時(shí)Styles.Render和Scripts.Render會(huì)為CSS bundle(script bundle)中的定義的每一個(gè)css(script)生成一個(gè)style(script)標(biāo)簽卜壕。當(dāng)開啟優(yōu)化時(shí), Styles.Render 和Scripts.Render生成唯一的style和script標(biāo)簽烙常,其中帶有版本戳的URL代表整個(gè)捆綁的css和script轴捎。
Q44. ASP.NET MVC中如何啟用捆綁優(yōu)化?
Ans.
使用BundleTable捆綁多個(gè)css文件和js文件蚕脏,以提高網(wǎng)絡(luò)加載速度和頁面解析速度侦副。
通過在Global.asax.cs文件中修改BundleTable的EnableOptimizations屬性來打開和關(guān)閉捆綁優(yōu)化。
protected void Application_Start()
{
//other code has been removed for clarity
//disable optimization
System.Web.Optimization.BundleTable.EnableOptimizations = false;
}
Q45. 什么是ViewStart?
Ans. _ViewStart.cshml 頁面是服務(wù)于具有相同布局的view(s) 驼鞭。該文件代碼優(yōu)于同一目錄下的其他view代碼先執(zhí)行秦驯。該文件也將遞歸應(yīng)用于子文件夾下的view(s)。 默認(rèn)挣棕,
ASP.NET MVC 項(xiàng)目在Views文件夾下僅有一個(gè) _ViewStart.cshtml 文件译隘。該文件中為你mvc 應(yīng)用程序指定了默認(rèn)的layout亲桥。
@{
Layout = "~/Views/Shared/Layout.cshtml";
}
因?yàn)樯厦孢@段代碼會(huì)在任何view之前運(yùn)行,所以可以通過override Layout 屬性為view指定一個(gè)不同的layout固耘。
Q46. 什么時(shí)候去使用 _ViewStart?
Ans. 當(dāng)有一系列的view具有相同的設(shè)置题篷, 就可以使用 _ViewStart.cshtml 來放置通用的視圖設(shè)置。 如果有任何視圖需要修改通用的設(shè)置可以通過在view中重載通用設(shè)置指定一個(gè)新值即可厅目。
Q47. ASP.NET MVC中有哪幾種方式去修改默認(rèn)的layout番枚?
1.修改根目錄下的Views文件夾的 _ViewStart文件。_ViewStart為web application定義了默認(rèn)layout頁面损敷『可以通過代碼根據(jù)不同的Controller加載不同的layout。
@{
var controller =
HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToSt
ring();
string layout = "";
if (controller == "Admin")
{
layout = "~/Views/Shared/_AdminLayout.cshtml";
}
else
{
layout = "~/Views/Shared/_Layout.cshtml";
}
Layout = layout;
}
2.在Views文件夾的某一個(gè)View目錄下新增 _ViewStart 文件拗馒。
3.在View頁面的頂部修改Layout
@{
Layout = "~/Views/Shared/_AdminLayout.cshtml";
}
4.在ActionResult中指定Layout
public ActionResult Index()
{
RegisterModel model = new RegisterModel();
//TO DO:
return View("Index", "_AdminLayout", model);
}
Q48. 介紹下ASP.NET MVC項(xiàng)目中的App_Start文件夾?
Ans. App_Start文件夾是從MVC4引入的路星,包含以下配置文件,比如
BundleConfig.cs诱桂, FilterConfig.cs洋丐,RouteConfig.cs,WebApiConfig.cs 访诱。所有的設(shè)置都是在Global.asax.cs文件的Application_Start方法中被注冊(cè)垫挨。
- BundleConfig.cs - 用來為css和js文件創(chuàng)建和注冊(cè)捆綁。默認(rèn)已經(jīng)包含了對(duì)jQuery, jQueryUI, jQuery validation, Modernizr, Site CSS的捆綁触菜。
- FIlterConfig.cs - 用來注冊(cè)全局的MVC過濾器九榔,比如error filters, actions filters 等。默認(rèn)包含 HandleErrorAttribute 過濾器涡相。
- RouteConfig.cs - 用來注冊(cè)不同的路由模式哲泊,默認(rèn)僅注冊(cè)一個(gè)名為Default的路由。
- WebApiConfig.cs - 用來注冊(cè)不同的WEB API 路由催蝗,也可用來設(shè)置額外的WEB API 配置選項(xiàng)切威。
Q49. ASP.NET MVC中返回/呈現(xiàn)一個(gè)View都有哪幾種方式?
Ans. 主要有以下四種方式:
- Return View() - 直接告訴MVC去生成指定的將要展示的視圖的HTML并發(fā)送到瀏覽器。這個(gè)相當(dāng)于ASP.NET WebForm中的 Server.Transfer() 丙号。
- Return RedirectToAction() - 這是告訴MVC去跳轉(zhuǎn)到指定的action而不是直接提供HTML先朦。這種方式下,瀏覽器將受到跳轉(zhuǎn)通知并重新發(fā)送一個(gè)指定action的新請(qǐng)求犬缨。這個(gè)類似與ASP.NET WebForm中的Response.Redirect() 喳魏。
而且, RedirectToAction 會(huì)根據(jù)路由表構(gòu)造了一個(gè)跳轉(zhuǎn)URL到指定的action/controller怀薛。RedirectToAction 會(huì)使瀏覽器收到302重定向狀態(tài)碼刺彩。 - Return Redirect() - - 這是告訴MVC去跳轉(zhuǎn)到指定的URL而不是直接提供HTML。這種情況下,瀏覽器收到重定向的通知并重新發(fā)送一個(gè)指定URL的新請(qǐng)求创倔。類似與ASP.NET WebForm中的Response.Redirect() 嗡害。你需要自己構(gòu)造完整的URL去進(jìn)行重定向。瀏覽器同樣會(huì)收到302重定向狀態(tài)碼畦攘。
- Return RedirectToRoute() - 這是告訴MVC去路由表中查找指定的路由霸妹,然后重定向到路由中定義的controller/action。同樣念搬,這也要發(fā)起一個(gè)新的請(qǐng)求抑堡。
備注:
- Return View 不會(huì)發(fā)起一個(gè)新的請(qǐng)求摆出。它只是進(jìn)行視圖渲染而不會(huì)更改瀏覽器地址欄的URL朗徊。
- Return RedirectToAction 發(fā)起了一個(gè)新的請(qǐng)求,而且瀏覽器地址欄的URL將被MVC生成的URL更新偎漫。
- Return Redirect 同樣是發(fā)起了一個(gè)新的請(qǐng)求爷恳,且瀏覽器地址欄的URL將被更新。但是你需要自己指定完整的URL進(jìn)行重定向象踊。
- 在 RedirectToAction 和 Redirect之間温亲,最佳實(shí)踐是在應(yīng)用程序中的actions/controllers中進(jìn)行跳轉(zhuǎn)時(shí)使用 RedirectToAction。因?yàn)槿绻褂肦edirect杯矩,一旦你更改了路由表栈虚,你就需要手動(dòng)去更改那些你自己構(gòu)造的URLs。
- RedirectToRoute 重定向到路由表中定義的指定路由史隆。