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

本節主要講解布局頁(Layout)的使用

Q40. 什么是 ASP.NET MVC的布局頁(Layouts)?
Ans. Layouts(布局頁)是用來使asp.net mvc中的views保持一致的外觀體驗。與webforms的master pages功能相似,但比其更加簡單且可擴展性更強。下面是一個布局頁的代碼展示:

<!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為你的網站定義一個通用的模板。layout可以直接在view的頂部直接聲明:

@{
 Layout = "~/Views/Shared/SiteLayout.cshtml";
}

Q41. 介紹下ASP.NET MVC中Sections(節)?
Ans. 通過section可以在layout中指定占用一塊內容區域。可以在view中按以下方式定義section。

@section header{
<h1>Header Content</h1>
}

在layout中通過@RenderSection("header")去渲染上面定義的section。
默認來說,如果在layout中定義了需要渲染的section,那么在view中就必須實現。但可以通過以下方式,限定section是可選的。@RenderSection("header",false)
備注:View只能定義已經在layout中指定渲染的section,否則會拋出異常。


Q42. RenderBody 和 RenderPage 的作用是?
Ans. RenderBody 方法是在layout頁面中調用的,是用來渲染呈現子頁面/視圖。它類似于webform引擎中master頁中的ContentPlaceHolder。一個layout頁面中只能有一個 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頁面中用來渲染加應用程序中的其他頁面。一個layout頁面中可以有多個RenderPage 方法。

@RenderPage("~/Views/Shared/_Header.cshtml");

Q43. Styles.Render 和Scripts.Render的功能是?
Ans. 它們是用來捆綁多個css文件和js文件,以提高網絡加載速度和頁面解析速度。Style.Render是用來呈現定義在BundleConfig.cs中捆綁的css文件。 Styles.Render為捆綁的css創建style標簽。
Scripts.Render 也是用來呈現捆綁的script文件。它會為捆綁的script文件創建script標簽。

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"));
 }

當關閉優化時Styles.Render和Scripts.Render會為CSS bundle(script bundle)中的定義的每一個css(script)生成一個style(script)標簽。當開啟優化時, Styles.Render 和Scripts.Render生成唯一的style和script標簽,其中帶有版本戳的URL代表整個捆綁的css和script。


Q44. ASP.NET MVC中如何啟用捆綁優化?
Ans.
使用BundleTable捆綁多個css文件和js文件,以提高網絡加載速度和頁面解析速度。
通過在Global.asax.cs文件中修改BundleTable的EnableOptimizations屬性來打開和關閉捆綁優化。

protected void Application_Start()
{
 //other code has been removed for clarity 
 //disable optimization
 System.Web.Optimization.BundleTable.EnableOptimizations = false;
}

Q45. 什么是ViewStart?

Ans. _ViewStart.cshml 頁面是服務于具有相同布局的view(s) 。該文件代碼優于同一目錄下的其他view代碼先執行。該文件也將遞歸應用于子文件夾下的view(s)。 默認,
ASP.NET MVC 項目在Views文件夾下僅有一個 _ViewStart.cshtml 文件。該文件中為你mvc 應用程序指定了默認的layout。

@{
 Layout = "~/Views/Shared/Layout.cshtml";
}

因為上面這段代碼會在任何view之前運行,所以可以通過override Layout 屬性為view指定一個不同的layout。


Q46. 什么時候去使用 _ViewStart?
Ans. 當有一系列的view具有相同的設置, 就可以使用 _ViewStart.cshtml 來放置通用的視圖設置。 如果有任何視圖需要修改通用的設置可以通過在view中重載通用設置指定一個新值即可。


Q47. ASP.NET MVC中有哪幾種方式去修改默認的layout?

1.修改根目錄下的Views文件夾的 _ViewStart文件。_ViewStart為web application定義了默認layout頁面。可以通過代碼根據不同的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文件夾的某一個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項目中的App_Start文件夾?
Ans. App_Start文件夾是從MVC4引入的,包含以下配置文件,比如
BundleConfig.cs, FilterConfig.cs,RouteConfig.cs,WebApiConfig.cs 。所有的設置都是在Global.asax.cs文件的Application_Start方法中被注冊。

  • BundleConfig.cs - 用來為css和js文件創建和注冊捆綁。默認已經包含了對jQuery, jQueryUI, jQuery validation, Modernizr, Site CSS的捆綁。
  • FIlterConfig.cs - 用來注冊全局的MVC過濾器,比如error filters, actions filters 等。默認包含 HandleErrorAttribute 過濾器。
  • RouteConfig.cs - 用來注冊不同的路由模式,默認僅注冊一個名為Default的路由。
  • WebApiConfig.cs - 用來注冊不同的WEB API 路由,也可用來設置額外的WEB API 配置選項。

Q49. ASP.NET MVC中返回/呈現一個View都有哪幾種方式?
Ans. 主要有以下四種方式:

  1. Return View() - 直接告訴MVC去生成指定的將要展示的視圖的HTML并發送到瀏覽器。這個相當于ASP.NET WebForm中的 Server.Transfer() 。
  2. Return RedirectToAction() - 這是告訴MVC去跳轉到指定的action而不是直接提供HTML。這種方式下,瀏覽器將受到跳轉通知并重新發送一個指定action的新請求。這個類似與ASP.NET WebForm中的Response.Redirect() 。
    而且, RedirectToAction 會根據路由表構造了一個跳轉URL到指定的action/controller。RedirectToAction 會使瀏覽器收到302重定向狀態碼。
  3. Return Redirect() - - 這是告訴MVC去跳轉到指定的URL而不是直接提供HTML。這種情況下,瀏覽器收到重定向的通知并重新發送一個指定URL的新請求。類似與ASP.NET WebForm中的Response.Redirect() 。你需要自己構造完整的URL去進行重定向。瀏覽器同樣會收到302重定向狀態碼。
  4. Return RedirectToRoute() - 這是告訴MVC去路由表中查找指定的路由,然后重定向到路由中定義的controller/action。同樣,這也要發起一個新的請求。

備注:

  1. Return View 不會發起一個新的請求。它只是進行視圖渲染而不會更改瀏覽器地址欄的URL。
  2. Return RedirectToAction 發起了一個新的請求,而且瀏覽器地址欄的URL將被MVC生成的URL更新。
  3. Return Redirect 同樣是發起了一個新的請求,且瀏覽器地址欄的URL將被更新。但是你需要自己指定完整的URL進行重定向
  4. 在 RedirectToAction 和 Redirect之間,最佳實踐是在應用程序中的actions/controllers中進行跳轉時使用 RedirectToAction。因為如果使用Redirect,一旦你更改了路由表,你就需要手動去更改那些你自己構造的URLs。
  5. RedirectToRoute 重定向到路由表中定義的指定路由。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容