第一个 MVC 应用程序(上半部分)(《精通 ASP.NET MVC5》 的第二章)
本章将使用 ASP.NET MVC 框架创建一个简单的数据录入应用程序。
笔者会将过程分解成一个个的步骤,以便能够看出如何构造 ASP.NET MVC 应用程序。(对于一些未进行解释的内容,笔者提供了参考章节,在那里你会看到完整的细节)
(由于各个 VS 版本不一样,有些功能用不了的话可以通过“工具”、“设置”、“专家设置”启用全部特性(新的版本可能不需要这一步))
第一步:创建新的 ASP.NET MVC 项目
1、“新建项目”——“Web(Visual C#)”——“ASP.NET Web 应用程序”
2、设置文件名、存储路径,单击“确定”按钮。
3、(该模板创建的项目带有不同的起点和特性配置,如认证、导航以及视觉主题等)为了保持事情简单,选择“空模板”选项,并在“添加文件夹和核心引用”部分勾选“MVC”复选框。(这会创建一个基本的 MVC 项目,它带有最少的预定义内容,这也是本书用于所有示例的起点)
(PS:其他模板选项意在为 ASP.NET 项目提供更为完整的起点。但笔者不喜欢这些模板,因为它们鼓励开发者将一些重要特性视为黑盒进行操作。本书的目标是为你提供知识并融合 MVC 应用程序的各个方面,因而本书所有示例使用的几乎是这个“空模板”)
第二步:添加一个控制器
在 MVC 体系架构中,输入请求是由控制器(Controller)来处理的。(在 ASP.NET MVC 中,控制器通常是一些继承于 “Syster.Web.Mvc.Controller” 的 C# 类。“Syster.Web.Mvc.Controller”是框架内置的控制器基类)
控制器中的每一个 public 方法(“类”,当然要有方法)都称为是一个动作方法——可以用某个 URL 通过 Web 来调用它执行一个动作。
MVC 约定,将控制器放在 Controllers 的文件夹中,该文件夹是在建立项目时创建的。
(提示:你不一定要遵循这一约定或其他大多数 MVC 约定,但笔者建议你还是遵循它——至少因为它有助于弄清本书示例的意思。(现在的编程方式提倡“约定优于配置”,这可以省去编程过程中很多琐碎的事情,故在可能的情况下,应当优先遵循约定))
对项目添加控制器步骤如下:
1、“右击“Controllers”文件夹”——“添加”——“控制器”
2、在“添加支架”对话框中,选择“MVC 5-空控制器”选项,然后单击“添加”按钮。
3、在“添加控制器”对话框中,将其名称设置为 “HomeController”,然后单击“添加”按钮。
(控制器名称有几个约定:提供的控制器名称应当指明其目的;默认的控制器名称为“Home”;控制器名称具有“Controller”后缀)
2.2.2 理解路由
除了模型、视图、控制器之外,MVC 应用程序还使用 ASP.NET 的路由系统——它决定如何将 URL 映射到控
制器和动作上。(当 Visual Studio 创建 MVC 项目时,会添加一些默认的路由,以使我们能够开始工作——你可以
请求以下任何一个 URL(“/”、“/Home”、“/Home/Index”),它们都会被引向 HomeController 上的 Index 动作。
(这受益于遵循 MVC 的约定——这里有一个名称为“HomeController ”的控制器))
如果不遵循这种约定,则需要修改路由,以指向所创建的替代控制器。(可以打开“App_Start文件夹”中的
“RouteConfig.cs文件”来查看和编辑路由配置。第16章和第17章将解释这个文件中的条目)对于这个简单示例,应用
默认配置就行了。
第三步:渲染 Web 页面
为了产生一个对浏览器的请求进行响应的 HTML,需要创建一个视图(View)。
1、修改控制器中的方法(在 HomeController.cs 文件中修改 Index 方法,以渲染一个视图)
public ViewResult Index ()
{ return View() ; }
当从一个动作方法返回一个 ViewResult 对象时,便是在指示 MVC 去渲染一个视图。(调用不带参数的View 方法,便可以
创建这个 ViewResult 对象。这是在告诉 MVC,去渲染该动作的默认视图)MVC 约定的另一个例子:视图是通过命名约定与动
作方法相关联的。(在 “Views”文件夹中将生成与方法具有相同名字的视图文件)
2、创建视图最简单的方法是要求 Visual Studio 来做这件事——在 HomeController.cs 文件的代码编辑窗口中定义 Index 动作
方法的任意地方右击,然后从弹出的菜单中选择“添加视图”。
3、在“添加视图”的对话框中配置待创建视图文件的初始内容:将“视图名”设置为“Index”(与该视图相关联的动作方法的名称,这是
另一个约定)——将“模板”设置为“空模板无模型”——让“创建为分部视图”和“使用布局页”复选框处于未选状态——单击“添加”按钮,
创建这一新的视图文件。
(Visual Studio 将在 Views \ Home 文件夹中创建一个名称为 “Index.cshtml” 的视图文件。这是 MVC 框架的另一个约定:视图
被放置在 Views 文件夹中,文件夹的结构是与其关联的控制器名称相对应的。)
该文件主要含有 HTML 语句。不同的是会看到如下所示的部分:
……
@{
Layout = null;
}
……
这是一个将由 Razor 视图引擎进行解释的表达式,Razor 引擎处理视图内容并生成发送给浏览器的 HTML。(这里是一个简单
的 Razor 表达式,它告诉 Razor 未选用布局——布局类似于发送给 HTML 模板)
在 Index.cshtml 的 div 中可以添加 “Hello World ( from the view )”,这一添加显示了用 HTML 标记显示出来的消息(而不
是由动作方法显示的字符串)。
在最初编辑 Index 动作方法时,它返回的是一个字符串值,这意味着 MVC 除了把这个字符串传递给浏览器之外,未做其他
事情。
现在,Index 方法返回了一个 ViewResult,MVC 框架渲染了一个视图并返回了它所产生的HTML。(这里并未告诉 MVC 应该
使用哪个视图,因此它会运用命名约定自动寻找一个视图。该约定是,视图包含在以控制器命名的文件夹之中,并且具有动作方法
的名称:Views /Home /Index.cshtml)
除了字符串和 ViewResult 对象之外,也可以从动作方法返回其他结果。例如,如果返回一个RedirectResult,浏览器将被重
定向到另一个 URL。这些对象统称为动作结果,它们都派生于ActionResult 类。(动作结果系统使开发者能够在动作中封装并重用
常用的响应,第17章将对其做更多介绍并演示一些更复杂的运用)
2.3.2 添加动态输出
Web 应用程序平台的关键是构造并显示动态输出。在 MVC 中,控制器的工作是构造一些数据,并将其传递给视图,而视图则
负责把它渲染成 HTML。
(现在有很多人都把“渲染”说成“呈现”,其实这种说法是不正确的。Web 页面从服务器到浏览器的整个呈现过程实际上分为三步:
第一步是通过视图引擎对视图文件进行解释,将视图文件中的代码转换成 HTML 标记,这一步叫做渲染;第二步是将渲染后的
HTML 标记传递给客户端浏览器,这一步是页面的传递;第三步是浏览器接收到 HTML 后对其进行处理并呈现为 Web 页面,这
一步才叫做呈现。由此可见,渲染是把页面的非 HTML 代码转换成 HTML 标记,这一步工作是由服务器完成的)
将数据从控制器传递给视图的一种方式是使用 ViewBag(视图包)对象,它是 Controller 基类的一个成员。ViewBag 是一种
动态对象,可以给它赋任意属性,使这些属性的值在随后渲染的视图中是可用的。
在 HomeController.cs 文件中设置一些视图数据:
public ViewResult Index()
{
int hour = DateTime.Now.Hour;
ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon";
return View();
}
当对 ViewBag.Greeting 属性进行赋值时,便是为视图提供数据。(Greeting 属性直到对其赋值的那一刻才会形成——这让
作者能够以自如而流畅的方式(即不必提前定义类)将数据从控制器传递给视图)
在视图中再次查阅 ViewBag.Greeting 属性,便可获得其数据值。
在 Index.cshtml 文件中接收 ViewBag 的数据值:
<div> @ViewBag.Greeting World ( from the view ) </div> (这里是一个 Razor 表达式)
当在控制器的 Index 方法中调用 View 方法时,MVC 框架会定位 Index.cshtml 视图文件,并要求 Razor 视图引擎解析该文
件的内容。Razor 会寻找类似于在该清单中所添加的这种表达式,并处理它们。(在这个例子中,处理该表达式意味着在视图
中插入作者在动作方法中赋给 ViewBag.Greeting 属性的值——这就是前面所提到的视图渲染过程)
对属性名称 Greeting 没有特别要求,用任意属性名来代替,照样会正常工作,只要在控制器中使用的名称与视图中使用
的名称相匹配即可。当然,通过对多个属性赋值,可以将多个属性值从控制器传递到视图。
【上半部分结束】
第一个 MVC 应用程序(上半部分)(《精通 ASP.NET MVC5》 的第二章)的更多相关文章
- 【MVC 4】1.第一个 MVC 应用程序
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> ASP.NET MVC 是微软的一个 Web开发框架,它整合了“模型—视图—控制器(MVC)”架构 ...
- 创建第一个MVC应用程序
整个国庆期假,Insus.NET没有出门,在家静心修炼MVC.这意味着Insus.NET将来的日子里会以MVC为学习,开发,应用作为重点,不过现在才开始踏出第一步...... 路慢慢...... 下载 ...
- 《精通ASP.NET MVC5》第7章 SportStore:一个真正的应用程序(1)
7.1 开始 7.1.1 解决方案 个工程. 1. 一个域模块工程. 2.一个MVC4应用. 3.一个单元测试工程. 现在我们就创建一个名为 SportsStore 的空 soluti ...
- 第一个 MVC 应用程序(下半部分)
2.4 创建一个简单的数据录入应用程序 本章的其余部分将通过一个简单的数据录入应用程序来考查 MVC 的更多基本特性.本小节打算分步进行,目的是演示 MVC 的运用. B1.设计一个数据模型 在 MV ...
- asp.net mvc 4 项目升级到 asp.net mvc5
一.开始 1.打开或新建asp.net mvc 4项目 2.修改 global.asax文件 原: WebApiConfig.Register(GlobalConfiguration.Configur ...
- ASP.NET MVC5 第4章
参考资料<ASP.NET MVC5 高级编程>第5版 第4章 模型 本章所探讨的模型是要显示.保存.创建.更新和删除的对象. 基架指使用 MVC 提供的工具为每个模型对象的标准索引构建.创 ...
- 《精通ASP.NET MVC5》第2章 第一个MVC应用程序
控制器 public class NewHomeController : Controller { // GET: /NewHome/ public ...
- [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API
问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...
- 【阅读笔记】《C程序员 从校园到职场》第二章 学校到职场
一.代码规范: 1.变量命名(让人一眼看它是什么意思,要做什么操作),定义并初始化 2.函数命名规范(函数的功能)在主函数之前进行声明. 在实际项目中,一般不在函数调用者的内部来对被调函数进行声明,而 ...
随机推荐
- Python入门之面向对象编程(一)面向对象概念及优点
概念 谈到面向对象,很多程序员会抛出三个词:封装.继承和多态:或者说抽象.一切都是对象之类的话,然而这会让初学者更加疑惑.下面我想通过一个小例子来说明一下 面向对象一般是和面向过程做对比的,下面是一个 ...
- bzoj1658: [Usaco2006 Mar]Water Slides 滑水
Description It's a hot summer day, and Farmer John is letting Betsy go to the water park where she i ...
- Android java 多线程(三)
- 20145332卢鑫 MSF基础应用
20145332卢鑫 MSF基础应用 实验过程 靶机的IP地址:192.168.10.160 Kali的IP地址:192.168.10.128 1.一个主动攻击 攻击XP系统的漏洞:ms08_067 ...
- 写Java代码的一些小技巧
写Java代码有三年多了,遇到过很多坑,也有一些小小的心得.特地分享出来供各位学习交流.这些技巧主要涉及谷歌Guava工具类的使用.Java 8新特性的使用.DSL风格开发.代码封装等技巧. 一.nu ...
- 【前端】javascript+jquery实现手风琴式的滚动banner或产品展示图
实现效果 实现步骤 // 鼠标放入到li中该盒子变宽,其他盒子变窄,鼠标移开大盒子,恢复原样 // 实现步骤 // 1. 给li添加背景 // 2. 绑定onmouseover事件,鼠标放入到li中, ...
- system.data.sqlite的源代码下载
帮助文档 http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki 历史版本https://system.data.sqlit ...
- 【分词器及自定义】Elasticsearch中文分词器及自定义分词器
中文分词器 在lunix下执行下列命令,可以看到本来应该按照中文”北京大学”来查询结果es将其分拆为”北”,”京”,”大”,”学”四个汉字,这显然不符合我的预期.这是因为Es默认的是英文分词器我需要为 ...
- C# 测算代码运行时间 Stopwatch
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); stop ...
- [Shiro] - Shiro之SpringBoot中的使用
下载了运行项目后,访问路径:http://localhost/shiro/login 这篇应该在进阶后面的. shiro中的重中之重,一定要看. 基于springboot+thymeleaf+shir ...