您的位置:首页 > 编程语言 > ASP

Asp.net mvc 知多少(四)

2017-01-31 21:30 555 查看
本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想看英文原版的可访问[http://www.dotnettricks.com/free-ebooks](http://www.dotnettricks.com/free-ebooks)自行下载。该书主要分为两部分,ASP.NET MVC 5、ASP.NET WEB API2。本书最大的特点是以面试问答的形式进行展开。通读此书,会帮助你对ASP.NET
MVC有更深层次的理解。*由于个人技术水平和英文水平也是有限的,因此错误在所难免,希望大家多多留言指正。***系列导航**[Asp.net mvc 知多少(一)](http://www.jianshu.com/p/5f6156cacc76)[Asp.net mvc 知多少(二)](http://www.jianshu.com/p/f9a5cd06bb77)[Asp.net mvc 知多少(三)](http://www.jianshu.com/p/4d6285ad825a)[Asp.net mvc 知多少(四)](http://www.jianshu.com/p/fe8dee26059d)
本节主要讲解布局页(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. 主要有以下四种方式:

Return View() - 直接告诉MVC去生成指定的将要展示的视图的HTML并发送到浏览器。这个相当于ASP.NET WebForm中的 Server.Transfer() 。

Return RedirectToAction() - 这是告诉MVC去跳转到指定的action而不是直接提供HTML。这种方式下,浏览器将受到跳转通知并重新发送一个指定action的新请求。这个类似与ASP.NET WebForm中的Response.Redirect() 。

而且, RedirectToAction 会根据路由表构造了一个跳转URL到指定的action/controller。RedirectToAction 会使浏览器收到302重定向状态码。

Return Redirect() - - 这是告诉MVC去跳转到指定的URL而不是直接提供HTML。这种情况下,浏览器收到重定向的通知并重新发送一个指定URL的新请求。类似与ASP.NET WebForm中的Response.Redirect() 。你需要自己构造完整的URL去进行重定向。浏览器同样会收到302重定向状态码。

Return RedirectToRoute() - 这是告诉MVC去路由表中查找指定的路由,然后重定向到路由中定义的controller/action。同样,这也要发起一个新的请求。

备注:

Return View 不会发起一个新的请求。它只是进行视图渲染而不会更改浏览器地址栏的URL。
Return RedirectToAction 发起了一个新的请求,而且浏览器地址栏的URL将被MVC生成的URL更新。
Return Redirect 同样是发起了一个新的请求,且浏览器地址栏的URL将被更新。但是你需要自己指定完整的URL进行重定向

在 RedirectToAction 和 Redirect之间,最佳实践是在应用程序中的actions/controllers中进行跳转时使用 RedirectToAction。因为如果使用Redirect,一旦你更改了路由表,你就需要手动去更改那些你自己构造的URLs。

RedirectToRoute 重定向到路由表中定义的指定路由。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: