课程7+上课日志2
课程7 MVC框架更快更简单地开发网站上课日志2一、路由配置详解1、路由基本配置与含义MVC中不存在起始页的概念了,而是通过路由来访问的,在路由中配置即可。在项目文件中找到App_Start文件夹,并在该文件夹下的RouteConfig.cs 文件中修改RegisterRoutes ()方法。public static void RegisterRoutes(RouteCollection routes) routes.IgnoreRoute("resource.axd/*pathInfo"); routes.MapRoute( name: "Default",/指定规则的名称 url: "controller/action/id",/指明url格式:localhost/控制器名/Action名/传递的参数 /url: "controller/action/id-id2-id3",传递多个参数写法 defaults: new controller = "AdminLogin", action = "Login", id = UrlParameter.Optional ); 说明:name,url,defaults可以省略。2、路由配置扩展(1)可以创建多条路由规则,每条路由规则的name属性不能相同,这样的话输入请求url就可以有多种方式,比如下面的2个路由规则就可以输入controller-action或controller/actionpublic static void RegisterRoutes(RouteCollection routes) routes.IgnoreRoute("resource.axd/*pathInfo"); routes.MapRoute( name: "Default2", url: "controller-action/id", defaults: new controller = "AdminLogin", action = "Login", id = UrlParameter.Optional ); routes.MapRoute( name: "Default", url: "controller/action/id", defaults: new controller = "AdminLogin", action = "Login", id = UrlParameter.Optional ); (2)路由规则是有顺序的,如果被前面的规则匹配了,那么后面的就没有机会了,把上面2个路由规则位置对调,如果请求再输入localhost/AdminLogin-Login会发现报错。(3)constraints参数及namespaces参数routes.MapRoute( name: "Default", url: "controller/action/id", defaults: new controller = "Home", action = "Index", id = UrlParameter.Optional ,/ UrlParameter.Optional表示可选的意思 /路由规则增加一个参数constraints,可以给controller或Action增加约束(正则表达式)。只能下面表示控制器只能是数字 constraints: new controller="d+$",constraints: new controller="Home",action="Index|Test",表示控制器为Home,action为Index或Test,那么其他的action就匹配不到的 /路由规则再增加一个参数namespaces,表示到指定的命名空间下去搜索控制器,可以指定多个命名空间(因为控制器可以放在不同的文件夹,甚至是不同的项目,那么控制器所在命名空间就一般不相同),默认会先在bin目录下面遍历所有的dll,依次查找这些dll中继承自Controller的类进行匹配。比如 namespaces: new string "MvcApplication1.Controllers","MvcApplication1.User" );还有建立了不是以Controllers结尾的控制器类命名空间时,就可以通过设置这个属性来让路由系统在url匹配时应该去找那些命名空间在实例7.1的基础上完成图书信息展示以及图书信息的增删改查功能简称实例7-2二、为实例7-2更新实体数据模型1、展示实例7-2效果2、更新实体数据模型这里最好是把原来的实体数据模型删除,重新添加实体数据模型,重新选择所需要的2张表AdminLogin、Book。为什么不在原来的实体数据模型基础上更新模型?如果是数据库表中某字段做了更新,用【从数据库更新模型】比较好,如果是需要重新添加新表进来,最好是删除整个实体数据模型,然后重新添加实体数据模型,重新选择所需要的表,否则要生成后添加表的实体类比较麻烦。提示:删除实体数据模型后重新添加实体数据模型后,相应的上下文类名称一般改变了,所以原来用到的上下文类名称要注意更改下。三、Razor布局页(系统默认布局页)新建一个项目,选择MVC4 web应用程序,选择“基本”,确定之后系统会自动生成很多文件。(重点说明下Content、Scripts文件夹)再新建一个Home控制器,再新建视图,此时勾选使用布局或母版页,但什么都不选,如下图所示。此时生成的视图文件Index.cshtml代码基本为空,连<title></title> <head></head><body></body>都没有。 ViewBag.Title = "Index"<h2>Index</h2>但是实际上虽然布局页为空,但系统还是用了Shared文件夹下的_Layout.cshtml作为布局的。该布局页内容如下<!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>说明:上面使用Styles.Render()、Scripts.Render()引用App_start/BundleConfig.cs中的配置加载css、js文件,这样在视图文件中使用Scripts.Render()输出脚本包,Styles.Render()输出样式。RenderBody()表示网页内容放置的地方,即呈现子页的主体内容RenderSection("scripts", required: false)第一个参数指明:在子页面被渲染的节的名称,第二个参数:指定子页面这个节是否是必需的,如果指定了required:true;但是在子页面没有给这个名称的节的话,编译是通不过的。系统是怎么做到采用Shared文件夹下的_Layout.cshtml作为模板的呢?因为Shared文件夹下还有一个非常特殊的文件_ViewStart.cshtml,这里规定了默认的布局为Shared文件夹下的_Layout.cshtml。而且是所有的视图文件都默认使用这个布局。 Layout = "/Views/Shared/_Layout.cshtml"_ViewStart.cshtml文件代码优先于任何视图,任何视图都可以重写属性来指定自己想要的模板布局页面四、如何使用自己布局页1、创建自己的布局页先在views/Shared文件夹中创建好一个布局页(布局页),如xzxLayout.cshtml、应用自己的布局页然后在上面创建好的视图文件Index.cshtml中增加Layout = "/Views/Shared/xzxLayout.cshtml"表示采用xzxLayout.cshtml作为母版,如下: ViewBag.Title = "Index" Layout = "/Views/Shared/xzxLayout.cshtml"当然也可以直接修改_ViewStart.cshtml文件的属性。、改进布局页留多个“空”布局页如何留多个空,用于填充内容呢?比如为_Layout.cshtml增加一个空<!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> <div id="parent" style="background-color:cyan"> RenderBody() </div> <div id="2" style="background-color:seagreen"> RenderSection("leftBar",true)/true表示必须要填充的空 </div> Scripts.Render("/bundles/jquery") RenderSecti