当前位置:首页 > 从零开始学习ASP.NET MVC:开天辟地入门篇(一)

从零开始学习ASP.NET MVC:开天辟地入门篇(一)

点击次数:1325  更新日期:2010-12-31
\n

一.摘要


\n

和自身水平有关, 我总喜欢写入门级别的文章.比如虽然做项目用过一个内部的MVC框架, 但是当看到ASP.NET MVC时我却还是不知道从哪里入手开始学习的好.于是我写下这篇入门级的系列文章, 将老赵(Jeffrey Zhao)的ASP.NET MVC系列视频课程学到的知识再理解和再消化, 让最笨的人也能跟着我学懂ASP.NET MVC


\n

二.人物简介


\n

本文的很多资料都来自老赵 , Jeffrey Zhao. 此人相信不必我多说了吧, 高手,前辈,偶像, 对老赵的敬仰如滔滔江水连绵不绝, 如黄河泛滥一发不可收拾……(省下口水文字若干). 在我搜索有没有更简单并且系统的介绍ASP.NET MVC的资料时, 搜索到了老赵在Webcast上面的系列视频教程. 当然了高手的讲解都是比较全面的, 有时侯听了1小时, 真正理解的只有几句话.于是有了一边学习一边写此系列文章的想法.其中的知识都是从老赵的教程中学习到得.


\n

三.Hello ASP.NET MVC


\n

现在开始跟着我一步一步学习ASP.NET MVC.在什么都不知道之前, 还是让我们先下载一个ASP.NET MVC程序. 当看到程序运行后, 我的心才会踏实很多.


\n

首先去ASP.NET MVC的官网看看:


\n

http://www.asp.net/mvc/


\n

这里我们可以下载ASP.NET MVC的安装文件.目前最新版本是RC1 (注:RC, 即Release Candidate版本, 是距离正式版最近的一个版本.一般要经历RC1,2,3后即推出正式版)


\n

另外我们可以在CodePlex上获取源代码:


\n

http://www.codeplex.com/aspnet


\n

在官网上下载ASP.NET MVC安装文件, 一路回车完成安装. 启动VS2008 SP1(不是VS2008?不是SP1?作为一个专业的IT人士,水平可以菜,软件咱一定要用新的!去找个新版本吧!),点击新建,在Web中可以找到:


\n

image


\n

点击确定即创建了一个默认的MVC项目.同时还会创建一个测试项目. 这些我现在都不懂也不关注, 直接将Web项目中的default.aspx设置为启动页, 运行项目, 一个ASP.NET MVC的项目已经运行在我的电脑上了:


\n

image


\n

而且那个Home和About还能点击!虽然现在我什么都不懂, 不过看着能运行的实例, 心里就踏实多了!


\n

四.学习MVC的概念


\n

老赵的视频教程第一讲是”MVC模式与ASP.NET MVC框架概述”.主要讲解MVC的概念.那么让我们先来学习概念.


\n

我是如此理解MVC的:


\n

我们现在的一个ASP.NET页面通常需要做这些事情:


\n

1.获取一个页面需要的数据.


\n

2.在页面的Page_Load(页面加载)方法中为我们的页面控件绑定数据


\n

3.浏览器显示页面


\n

MVC即Model, View, Controller


\n

Model就是我们1中获取的网页需要的数据


\n

Controller就是我们获取数据,然后将数据绑定到页面控件的这个业务流程.不十分正确但是可以先这样理解: Controller就是我们的Page_Load方法逻辑.


\n

View就是我们的aspx页面,注意这是一个不包含后台代码文件的aspx页面.(其实带有.asp.cs文件也不会有编译错误,但是这样写代码就违背了MVC的设计初衷)


\n

下面这张图很好的概括了MVC的作用:


\n

image


\n

一个URL请求, ASP.NET MVC引擎会分析这个URL要使用那个Controller, 这个Controller(实际上真正的方法是Controller的Action)从数据库或者其他数据源获取数据,通常这些数据是一个业务的模型类(即MVC中的Model). Controller将Model对象传递给页面(即MVC中的View), 页面显示在浏览器上.(这一步是ViewEngine的功能, 我们一般的ASPX页面使用的是WebForm的ViewEngine,当然也可以替换.)


\n

五.学习实例首页


\n

简单的概念也有了.实例也能运行了.现在就是看看这个实例是如何使用ASP.NET MVC的.从首页下手.


\n

1.寻找入口方法


\n

首页网站的地址应该是 http://localhost:1847/home/index , 为什么地址不是具体的页面但是最后却将请求提交给了view/home/Index.aspx 页面? 很明显是使用了URL重写. ASP.NET中叫做UrlRouting,对应的程序集是System.Web.Routing, 打开项目的Global.asax.cs文件, 会找到我们建立的页面重写规则:

        public static void RegisterRoutes(RouteCollection routes)
\n {
\n routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);

\n

routes.MapRoute(
\n “Default”, // Route name
\n “{controller}/{action}/{id}”, // URL with parameters
\n new { controller = “Home”, action = “Index”, id = “” } // Parameter defaults
\n );

\n

}

\n

protected void Application_Start()
\n {
\n RegisterRoutes(RouteTable.Routes);
\n }

\n

.csharpcode, .csharpcode pre
\n{
\n font-size: small;
\n color: black;
\n font-family: consolas, “Courier New”, courier, monospace;
\n background-color: #ffffff;
\n /*white-space: pre;*/
\n}
\n.csharpcode pre { margin: 0em; }
\n.csharpcode .rem { color: #008000; }
\n.csharpcode .kwrd { color: #0000ff; }
\n.csharpcode .str { color: #006080; }
\n.csharpcode .op { color: #0000c0; }
\n.csharpcode .preproc { color: #cc6633; }
\n.csharpcode .asp { background-color: #ffff00; }
\n.csharpcode .html { color: #800000; }
\n.csharpcode .attr { color: #ff0000; }
\n.csharpcode .alt
\n{
\n background-color: #f4f4f4;
\n width: 100%;
\n margin: 0em;
\n}
\n.csharpcode .lnum { color: #606060; }

\n

关于Routing的深入了解将在以后介绍, 这里我们完全可以照葫芦画瓢, 按照实例添加新的重写规则.


\n

最后, http://localhost:1847/home/index 就被解析为:


\n

Controller为Home, Action为Index, 没有id参数.


\n

2.寻找Controller


\n

在Controllers文件夹下我们可以找到HomeController.cs, 这里使用了一个约定, 就是如果URL中获取到的Controller名字是Home, 则他的Controller类名就是HomeController. 在URL中的名字后加上”Controller”.


\n

实例中Controller都放在Controllers文件夹, 所以我们可以按照命名约定很容易就可以找到HomeController类


\n

3.寻扎Action


\n

打开HomeControllers.cs, 发现里面有两个方法:

        public ActionResult Index()
\n {
\n ViewData["Message"] = “Welcome to ASP.NET MVC!”;

\n

return View();
\n }

\n

public ActionResult About()
\n {
\n return View();
\n }

\n

.csharpcode, .csharpcode pre
\n{
\n font-size: small;
\n color: black;
\n font-family: consolas, “Courier New”, courier, monospace;
\n background-color: #ffffff;
\n /*white-space: pre;*/
\n}
\n.csharpcode pre { margin: 0em; }
\n.csharpcode .rem { color: #008000; }
\n.csharpcode .kwrd { color: #0000ff; }
\n.csharpcode .str { color: #006080; }
\n.csharpcode .op { color: #0000c0; }
\n.csharpcode .preproc { color: #cc6633; }
\n.csharpcode .asp { background-color: #ffff00; }
\n.csharpcode .html { color: #800000; }
\n.csharpcode .attr { color: #ff0000; }
\n.csharpcode .alt
\n{
\n background-color: #f4f4f4;
\n width: 100%;
\n margin: 0em;
\n}
\n.csharpcode .lnum { color: #606060; }

\n

其中的Index和About都是Action.这个Action是个什么东东呢?目前我只知道一个Controller可以包含多个Action, MVC模式中Controller角色的具体实现逻辑都是在Action中的.


\n

因为我们的Action是Index, 所以自然就要调用Index()方法.这里将”Webcome to ASP.NET MVC!”, 这里的Model角色就是这句话, 也就是一个字符串对象.


\n

Controller的一个重要作用就是将Model对象传递给View,也就是具体的页面. 传递的方法就是将这个字符串放到ViewData这个集合对象中, 然后在页面上也调用这个对象获取数据. 这个ViewData 对象一定是静态的, 或者至少是和HttpContext对象关联的, 否则到了View页面上是不能够调用的.但是也不知道ASP.NET MVC是在什么时候创建了这个对象.有心深入的一会去源代码里找找就能找到答案了.


\n

4.寻找View


\n

Model有了,数据有了, 接下来要跳转到View去显示数据了.第一个问题就是如何从Controller中跳到View上? return View() 这句话实现了此功能.其实如果这样写大家会更清楚:

        public ActionResult Index()
\n {
\n ViewData["Message"] = “Welcome to ASP.NET MVC!”;

\n

return View(“index”);
\n }


\n

\n

.csharpcode, .csharpcode pre
\n{
\n font-size: small;
\n color: black;
\n font-family: consolas, “Courier New”, courier, monospace;
\n background-color: #ffffff;
\n /*white-space: pre;*/
\n}
\n.csharpcode pre { margin: 0em; }
\n.csharpcode .rem { color: #008000; }
\n.csharpcode .kwrd { color: #0000ff; }
\n.csharpcode .str { color: #006080; }
\n.csharpcode .op { color: #0000c0; }
\n.csharpcode .preproc { color: #cc6633; }
\n.csharpcode .asp { background-color: #ffff00; }
\n.csharpcode .html { color: #800000; }
\n.csharpcode .attr { color: #ff0000; }
\n.csharpcode .alt
\n{
\n background-color: #f4f4f4;
\n width: 100%;
\n margin: 0em;
\n}
\n.csharpcode .lnum { color: #606060; }

\n

View方法中可以带一个名字, 这个名字就是View的名字.如果把index改成about,那么访问/home/index就会跳转到about页!


\n

虽然知道了我们要返回到名称是”index”的View上, 但是这个View的页面在哪里呢?在Web中有一个Views文件夹:


\n

image


\n

这里面存放的都是View对象, 也就是只有显示功能的aspx页面文件.但是aspx文件要遵循约定: Views下面要按照Controller创建文件夹, 比如HomeController就对应Home文件夹, 然后在里面添加view, 比如index.aspx, 那么在HomeController中返回到名为Index的View对象实际就会返回Views/Home/Index.aspx页面.


\n

如果不写View的名字, 则认为Action的名称就是View的名称.


\n

5.页面展示


\n

最后的工作就是View页面使用Model数据完整页面显示工作, 在index.aspx这个没有后台代码的View对象中, 通过ViewData对象获取Model:

<%= Html.Encode(ViewData["Message"]) %>

\n

接下来ViewEngine即页面引擎会将aspx中的HTML部分以及上面的数据部分和在一起返回给浏览器.


\n

关于View对象我注意到此页面是继承自System.Web.Mvc.ViewPage而不是直接继承自System.Web.UI.Page, 而这个ViewData对象就是ViewPage中的一个属性. 这里的ViewData一定是页面级别的,当页面编译完毕这个对象就会被注销(HTTP是无状态的协议,每次请求其实都是生成一个新的ViewPage对象).

\n

.csharpcode, .csharpcode pre
\n{
\n font-size: small;
\n color: black;
\n font-family: consolas, “Courier New”, courier, monospace;
\n background-color: #ffffff;
\n /*white-space: pre;*/
\n}
\n.csharpcode pre { margin: 0em; }
\n.csharpcode .rem { color: #008000; }
\n.csharpcode .kwrd { color: #0000ff; }
\n.csharpcode .str { color: #006080; }
\n.csharpcode .op { color: #0000c0; }
\n.csharpcode .preproc { color: #cc6633; }
\n.csharpcode .asp { background-color: #ffff00; }
\n.csharpcode .html { color: #800000; }
\n.csharpcode .attr { color: #ff0000; }
\n.csharpcode .alt
\n{
\n background-color: #f4f4f4;
\n width: 100%;
\n margin: 0em;
\n}
\n.csharpcode .lnum { color: #606060; }

\n

六.总结


\n

虽然仅仅是第一篇入门文章, 但是是不是觉得已经会用ASP.NET MVC了? 虽然学习不可以骄傲, 但是可以自豪的是ASP.NET MVC我已经不再陌生, 即使不能驾轻就熟, 偶尔说出来几个概念,给你解释解释啥是MVC, 还是很能吓唬人的. 这篇文章相当于老赵前两篇视频的知识. 本着每日一篇的原则, 我将会继续学习老赵的系列教程, 将自己的理解贡献出来. 不求最深, 但求易懂.


\n

来源:http://www.cnblogs.com/zhangziqiu

\n