跟我一起学习ASP.NET 4.5 MVC4.0(二)

简介: 原文http://www.cnblogs.com/xdotnet/archive/2012/03/06/aspnet_mvc40_keywords.html上一篇文章中(跟我一起学习ASP.NET 4.5 MVC4.0(一)) 我们基础的了解了一下ASP.NET MVC4.0的一些比较简单的改变,主要是想对于MVC3.0来说的。

原文http://www.cnblogs.com/xdotnet/archive/2012/03/06/aspnet_mvc40_keywords.html

上一篇文章中(跟我一起学习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这个就不一样了。 

 

昨天所写和今天所讲都是比较基础的,学习都需要通过循序渐进,这样才可以慢慢进入正题,我希望我所写的能够给他人带来一点收获。我没有整体规划一下写作的内容,经常都是想到什么写什么,所以可能会给初学者带来不好的感觉,敬请原谅。 

关于作者:网魂小兵

文章出处:http://xdotnet.cnblogs.com

本文可以随意转载,摘抄等非商业用途。

为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处。

 
目录
相关文章
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
71 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
100 5
|
2月前
|
机器学习/深度学习 存储 编解码
多任务学习新篇章 | EMA-Net利用Cross-Task Affinity实现参数高效的高性能预测
多任务学习新篇章 | EMA-Net利用Cross-Task Affinity实现参数高效的高性能预测
42 0
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
124 0
|
3月前
|
NoSQL 关系型数据库 MongoDB
【DotNetGuide】C#/.NET/.NET Core学习、工作、面试指南
【DotNetGuide】C#/.NET/.NET Core学习、工作、面试指南
106 0