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奢驯。本書最大的特點(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. 主要有以下四種方式:

  1. Return View() - 直接告訴MVC去生成指定的將要展示的視圖的HTML并發(fā)送到瀏覽器。這個(gè)相當(dāng)于ASP.NET WebForm中的 Server.Transfer() 丙号。
  2. 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)碼刺彩。
  3. 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)碼畦攘。
  4. Return RedirectToRoute() - 這是告訴MVC去路由表中查找指定的路由霸妹,然后重定向到路由中定義的controller/action。同樣念搬,這也要發(fā)起一個(gè)新的請(qǐng)求抑堡。

備注:

  1. Return View 不會(huì)發(fā)起一個(gè)新的請(qǐng)求摆出。它只是進(jìn)行視圖渲染而不會(huì)更改瀏覽器地址欄的URL朗徊。
  2. Return RedirectToAction 發(fā)起了一個(gè)新的請(qǐng)求,而且瀏覽器地址欄的URL將被MVC生成的URL更新偎漫。
  3. Return Redirect 同樣是發(fā)起了一個(gè)新的請(qǐng)求爷恳,且瀏覽器地址欄的URL將被更新。但是你需要自己指定完整的URL進(jìn)行重定向象踊。
  4. 在 RedirectToAction 和 Redirect之間温亲,最佳實(shí)踐是在應(yīng)用程序中的actions/controllers中進(jìn)行跳轉(zhuǎn)時(shí)使用 RedirectToAction。因?yàn)槿绻褂肦edirect杯矩,一旦你更改了路由表栈虚,你就需要手動(dòng)去更改那些你自己構(gòu)造的URLs。
  5. RedirectToRoute 重定向到路由表中定義的指定路由史隆。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魂务,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泌射,更是在濱河造成了極大的恐慌粘姜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔酷,死亡現(xiàn)場(chǎng)離奇詭異孤紧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拒秘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門号显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躺酒,你說我怎么就攤上這事押蚤。” “怎么了阴颖?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵活喊,是天一觀的道長。 經(jīng)常有香客問我,道長钾菊,這世上最難降的妖魔是什么帅矗? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮煞烫,結(jié)果婚禮上浑此,老公的妹妹穿的比我還像新娘。我一直安慰自己滞详,他們只是感情好凛俱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著料饥,像睡著了一般蒲犬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岸啡,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天原叮,我揣著相機(jī)與錄音,去河邊找鬼巡蘸。 笑死奋隶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悦荒。 我是一名探鬼主播唯欣,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搬味!你這毒婦竟也來了境氢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤身腻,失蹤者是張志新(化名)和其女友劉穎产还,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘀趟,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脐区,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了她按。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牛隅。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酌泰,靈堂內(nèi)的尸體忽然破棺而出媒佣,到底是詐尸還是另有隱情,我是刑警寧澤陵刹,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布默伍,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏也糊。R本人自食惡果不足惜炼蹦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狸剃。 院中可真熱鬧掐隐,春花似錦、人聲如沸钞馁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僧凰。三九已至探颈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間允悦,已是汗流浹背膝擂。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工虑啤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隙弛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓狞山,卻偏偏與公主長得像全闷,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萍启,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容