跟我一起学习ASP.NET 4.5 MVC4.0(二)
上一篇文章中(跟我一起学习ASP.NET 4.5 MVC4.0(一))我们基础的了解了一下ASP.NET MVC4.0的一些比较简单的改变,主要是想对于MVC3.0来说的。因为这一些列主要是要给ASP.NET MVC初学者,或者还没有使用过MVC的ASP.NET开发者进行培训学习,当然也可以让我温习一下这种开发模式。所以本篇不得不讲解一下Razor的一些语法,以及在ASP.NET MVC开发中的一些技巧和开发方法。由于我在开发中不喜欢使用Entity Framework,所以这里我需要解释一下我认为的三层架构和MVC开发模式的应用。本人开发的三层架构中,数据库层和逻辑层基本不变,唯一改变的是UI层换成了MVC模式开发。当然,模型实例如果有需要会重新写,否则就会直接使用实体类进行替代,这只是我个人认识说不定是不正确的,希望各位大师能够多多指教。
首先我们来了解一下Razor的语法,在VS2010或者VS11中,添加一个试图就会让你选择使用Razor(cshtml)还是C#(ASPX)格式。Razor在语法上的美化是显而易见的,但是有时候会出现一些莫名其妙的错误,但是一般都可以得到解决,要么加HTML标签,要么是有“()”等等都可以得到解决,这个也许是在编写的Text Template对我们所写的文本解析有点问题而已。

在Razor中使用“@”来替代“<%%>”的编码格式,当然如果需要代码块,就需要用到“@{}”。在其中就可以编写C#代码,配合VS的只能解析,一般有过开发经验的人都可以很容易上手。如果你想了解更多的语法相关问题,可以参考MVC3 Razor视图引擎的基础语法,下面介绍一下在MVC中很重要的几个关键字,在编程过程中会经常使用到。
一、@model模型定义
使用@model关键字可以定义一个Action里所对应的一个模型(经常可以叫他实体类),其实是对动态变量进行实例化,这样就可以直接在cshtml文件中调用“Model”变量。而这个模型的实例,需要通过Controller进行传输,如果没有则“Model”将为null。
模型可以是一个实体类,也可以是一个列表实例,字典对象都可以进行定义,但是和Controller中的Action传回来的实例一定要一样,否则将会出现错误。例如我们获取用户实例,并且在页面上呈现用户的具体信息,这样就可以将用户实例返回给前台cshtml页面,具体代码如下。
1 /// <summary>
2 /// 获取用户信息。
3 /// </summary>
4 /// <returns>返回行为结果。</returns>
5 public ActionResult UserInfo()
6 {
7 var id = Convert.ToInt32(Request.QueryString["id"] ?? "0");
8 var user = Users.GetUser(id);
9 return View(user);
10 }
只要在cshtml页面上定义“@model User”这样这个页面的基本模型(Model)就是这个User类了,当然如果不为空的时候就可以直接调用了。
二、@section节点关键字
这里首先需要了解一下布局页面,在ASP.NET MVC中约定,以“_”开头的文件在浏览器上面是不能访问的,而“Shared”文件夹是一个共享的文件夹,或者叫做通用文件夹。一般不可以定义一个SharedController,这个我没试过,有兴趣你可以试试。而“_viewstart.cshtml”里所指定的文件就是布局页面,相当于ASP.NET里的Master页面,这样讲应该会比较好了解。每一个布局页都必须调用一个方法“@RenderBody()”,而这个@section就有点像placeholder一样,所知名的块名称需要和布局页里面定义的名称一样。

上面就可以很清楚的看到,其中required参数表示在子页面中是否一定要重写,一般不需要所以设置为false。如果是true表示所有布局页的字页面都必须要有这个节点重现的代码块,在子页面中调用可以从下面的图中看到。

由于@section header设置了required:false,所以不重写没关系,忽略他。节点一般使用“{}”包裹,而下面部分没有指定的就是Body部分了,用好布局页可以减少很多代码,这个是值得推荐的。
三、@helper方法定义
使用@helper关键字可以定义一个方法,这样就可以在页面中调用这个方法了,和C#中的方法一样。在页面中定义的方法可以访问ViewBag,HttpContext等等页面的属性,返回的类型为“HelperResult”。其他的写法和普通的方法没有区别,主要用于列表等等需要重复写进行可重复调用。
这个关键字还可以在App_Code文件夹中定义很多个方法集,我最常用的就是定义分页,比如只需要传入记录数,每页显示的记录数,以及当前页码和URL格式化参数,就可以在页面中很简单的呈现分页内容。之所以推荐在App_Code这个文件夹中定义,是因为可以省略命名空间,文件名就是类名,而定义的方法就可以直接使用“FileName.MethodName”格式调用,即静态方法类。所以在这里定义的方法,不能够使用页面上面的ViewBag等等属性。
用好了以上三个关键字不仅对MVC有一个深刻的认识,也可以使得提高编码重用度。下面我再介绍一下ASP.NET MVC中文件夹结构和MVC中的对应关系,这个对于初学者来说是个很大的问题,因为我发现刚刚进行开发的人员找不到页面,找到页面又找不到控制器。借助VS11这种文件显示结构,会更好理解,如下图所示。

从上图就可以很好的理解,Models-Views-Controllers这就组成了MVC,在Models中一般定义一些模型实体,并且会添加一些验证,这些模型实体类供控制器Controllers中的方法调用。在Controllers中定义的类型和Views文件夹下的文件夹名称相对应,文件夹名加上“Controller”就是控制器名称,这是一种命名约定就像Attribute一样。而其中的方法当然对于的就是Views下文件夹下的文件名了,这些都是一一对应的。当然有些控制器返回的如果不是试图,可以不需要定义这些文件名,但是如果是返回试图,就会出现找不到cshtml页面的错误。
注:控制器的这种命名约定只是对于Internet Application,对于WebAPI这个就不一样了。
昨天所写和今天所讲都是比较基础的,学习都需要通过循序渐进,这样才可以慢慢进入正题,我希望我所写的能够给他人带来一点收获。我没有整体规划一下写作的内容,经常都是想到什么写什么,所以可能会给初学者带来不好的感觉,敬请原谅。
跟我一起学习ASP.NET 4.5 MVC4.0(二)的更多相关文章
- 跟我一起学习ASP.NET 4.5 MVC4.0(一)
跟我一起学习ASP.NET 4.5 MVC4.0(一) 由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0 (转)
跟我一起学习ASP.NET 4.5 MVC4.0(一) 由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最 ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(五)(转)
前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(一)(转)
由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一下ASP. ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(五)
前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(六)(转)
这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系统,VS2012和SQLServer 2012,顺便抽空继续一篇.随着VS2012 RC版本的放出,ASP.NET M ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(四)(转)
前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(三)(转)
今天我们继续ASP.NET 4.5 MVC 4.0,前两天熟悉了MVC4.0在VS11和win8下的更新,以及MVC中的基础语法和几个关键字的使用.了解了这些就可以对MVC进一步认识,相信很多人都对M ...
- 跟我一起学习ASP.NET 4.5 MVC4.0(六)
这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系统,VS2012和SQLServer 2012,顺便抽空继续一篇.随着VS2012 RC版本的放出,ASP.NET M ...
随机推荐
- 完美解决vim在终端不能复制的问题
以前 用xshell,或者其他工具ssh到远程服务器,vim不能复制,搜索说是vim的 -xterm_clipboard没有开启. 今天发现,至少鼠标复制是不需要这个东东的! 在stackoverfl ...
- linux下命令行工具gcp显示拷贝进度条
1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...
- JS事件监听器
JS事件监听器 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Javasc ...
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 【查看内存参数详解】Linux free -m 详细说明
free 命令相对于top 提供了更简洁的查看系统内存使用情况:$ free total used ...
- CodeForces 1029E div3
题目链接 第一道场上自己做出来的E题...虽然是div3,而且是原题... 当时做完ABC,D题没有思路就去怼E了,然后发现貌似原题? 事实上就是原题... 给个原题链接... [HNOI2003]消 ...
- java 正则表达式验证邮箱格式是否合规 以及 正则表达式元字符
package com.ykmimi.testtest; /** * 测试邮箱地址是否合规 * @author ukyor * */ public class EmailTest { public s ...
- 初探 Yii2 的测试模式 index-test.php
有没有发现高级版每个应用的 web 目录下有两个入口文件,一个index.php 一个 index-test.php通过init.bat可以切换到调试模式和产品模式,这两个模式相信同学们都很熟悉了,那 ...
- Linux——vim/vi 简单学习笔记
Vim/Vi是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器,它的作用是建立.编辑.显示文本文件.Vim/Vi 没有菜单,只有命令. 早前也用过Vim变过C++/C的代码, ...
- shell 跳出循环
跳出循环 break命令 例: #!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1 ...