视图简介
在 ASP.NET MVC 应用程序中,所有传入的请求均由控制器处理,并将这些请求映射到控制器相应的方法上
控制器方法可能会返回一个视图,也可能执行其它类型的操作,例如重定向到另一个控制器方法上
如果使用 MVC 框架,最流行的创建 HTML 的方法是使用 ASP.NET MVC 的 Razor 视图引擎
为了使用 Razor 视图引擎,一个控制器方法将产生一个 ViewResult (实现IActionResult接口)对象,而一个 ViewResult 可以携带我们想要使用的 Razor 视图的名称。
即我们可以在控制器中组装数据,再将数据通过Model绑定或ViewBag、ViewData对象将组装的数据返传递给View,之后控制器将View(中的Html)返回给浏览器。
其过程如下:
控制器决定返回哪个视图、视图中的数据是什么样,而最终响应给浏览器的HTML代码是根据视图进行生成的。
创建一个视图
DeptController下有名为”Index“、”Add“的Action,他们均需要返回一个ViewResu则我们目录结构图下图所示:
在cshtml文件中我们可以直接使用Html代码进行编写,结构同Html结构
此时运行程序并访问Action就会加载刚才你写的视图页面
使用Razor布局解决视图公共部分
比如我们的系统使用如下图所示的圣杯布局
除登录页外所有页面面的header、left、right、footer部分都相同,只有center部分根据不同页面显示不同内容。
如果我们不使用Razor布局,也可以使用iframe的方式进行引入,但这种方式存在一些弊端,比如以下几种:
第一次打开页面是浏览器需要多次向服务器请求页面内容,存在一定开销
我们没有办法将其中某一页的地址发给其他人打开,如果直接打开center部分的页面则header、left、right、footer这些部分的内容不会显示(除非你使用URL重写或将center部分地址带入到)。
必须控制center部分的页面能被哪些域嵌入,否则可能存在xss攻击的风险,因为parent页可以取到iframe中的cookies信息并修改页面的html代码内容。
因此我们可以考虑在每个视图中单独呈现这些公共部分,但每个页手动编写存在工作量大、修改麻烦(一旦一个地方需要改动,可能每个视图都得修改)。
好在,mvc为我们提供了一套解决方案,即”Razor布局“。
我们在上文提到的Views目录下再新建一个"shared"目录,在"shared"目录新建一个视图布局,名为_Layout.cshtml
之后打开这个Razor布局文件,我们可以将html的公共部分写在这个文件里,然后每个页需要展示不同信息的地方(如center部分)写如下代码
然后我们再为控制器中的每个Action创建各自的视图,此时,请注意,因为公共部分已经写到了Razor布局文件,每个视图生成Html时都会有这些部分,因为、等标签是不需要在写的,我们只要在这些视图中写上要放在id为"mainFrame"的DIV中的内容即可
如Dept/Index的视图里面的代码:
当然我们需要在各个action的视图中标明他需要使用哪个公共布局,即在视图的最顶部加上以下代码:
利用Razor视图开始(ViewStart)批量配置布局
当有非常多视图都需要引入相同的布局时,我们可以按上面的方法在每个试图单独写Layout=”*****“,也可以使用Razor视图开始,在Razor视图开始中编写的引用在其作用域下所