ASP.NET MVC Framework体验(1):从一个简单实例开始

概述

1210微软发布了ASP.NET 3.5扩展的预览版,在其中包括了ASP.NET MVC FrameworkASP.NET AJAX改进、ASP.NET动态数据支持、ASP.NET SIlverlight支持、以及ADO.NET Data Services等。我也在第一时间下载下来进行了安装,体验了一下微软的ASP.NET MVC Framework

提起MVC,相信大家都不陌生了,这里简单的提两句,将一个应用的实现分成三部分:模型(Model)、视图(View)、控制器(Controller)。模型用来保持状态,视图只负责信息的显示,控制器用户处理和回应用户的输入和交互。本文就通过一个简单的实例来体验一下ASP.NET MVC Framework

安装

1.需要安装VS2008 RTM或者Visual Web Developer 2008 Express

2.下载安装ASP.NET 3.5 Extensions。下载地址:http://asp.net/downloads/3.5-extensions

创建MVC应用程序

安装完成后,会在新建网站里面看到ASP.NET 3.5 Extensions Web Sites一项(我用的是Visual Web Developer 2008 Express):


建立完成后,站点的结构与普通的Web Site并没有不同(在VS 2008 RTM下不知道是什么样的),只不过在Web.config中添加了一些配置,如添加了UrlRoutingModule

<add name="UrlRoutingModule" type="System.Web.Mvc.UrlRoutingModule,

      System.Web.Extensions, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

建立数据模型对象(Model

App_Code文件夹下,建立一个Models文件夹,添加一个LINQ to SQL Classes


命名ProductProductInfo

建立控制器(Controller

App_Code文件夹下,建立Controllers文件夹,并添加ProductController.cs,编写代码如下:

public class ProductController : Controller

{

    [ControllerAction]

    public void Index()

    {

        MSPetShopDataContext db = new MSPetShopDataContext();

        ProductInfo productinfo = db.ProductInfos.Single(p => p.ProductId == "BD-03"); 

 

        RenderView("Product", productinfo);

    }

}

这里创建了一个名为IndexAction,查询产品信息。并调用RenderView方法,第一个参数Product指定要显示的视图名,第二个参数是传递给视图的数据。

建立视图(View

在站点下添加Views文件夹,并添加Product.aspx,使其不再继承于Page,而继承于泛型的ViewPage

public partial class Product_Product : ViewPage<ProductInfo>

{

    protected void Page_Load(object sender, EventArgs e)

    {

 

    }

}

显示数据,在ASPX中编写:

<div>

    <h2>ProductDetail:</h2>

    ProductId<%= ViewData.ProductId %><br /><br />

    Name<%= ViewData.Name %><br /><br />

    Descn<%= ViewData.Descn %>

</div>

这里也可以使用服务器控件进行数据的显示,后面再说。

配置路径选择(Route

最后一步,需要在Global.asax中配置路径选择,在Application_Start中编写:

void Application_Start(object sender, EventArgs e)

{

    // Code that runs on application startup

    RouteTable.Routes.Add(

        new Route

        {

            Url = "[controller]/[action].mvc",

            Defaults = new { action = "Index"},

            RouteHandler = typeof(MvcRouteHandler)

        }

        );

}

这里配置的路径相当于访问时的示例路径为Product/Index.mvc,如果如下配置:

void Application_Start(object sender, EventArgs e)

{

    // Code that runs on application startup

    RouteTable.Routes.Add(

        new Route

        {

            Url = "[controller]/[action]",

            Defaults = new { action = "Index"},

            RouteHandler = typeof(MvcRouteHandler)

        }

        );

}

那就等于访问的时的路径为Product/Index,不带有MVC的扩展名。

完成运行

至此,一个简单的MVC例子编写完成,运行后:

结束语

对于ASP.NET MVC Framework简单的体检就到这里了,后面有时间我会写一些复杂一点的示例,不管怎么说,ASP.NET MVC Framework为我们开发Web应用多提供了一种选择。

示例文件下载:/Files/Terrylee/MVCDemo01.rar

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-12-11 11:24 TerryLee 阅读(16233) 评论(106) 编辑 收藏

评论共2页: 上一页 1 2 
 回复 引用   
#7楼 2007-12-11 12:00 Guozhijian[未注册用户]
ASP.NET SIlverlight支持是什么?
可以在Asp.net 应用程序中使用silverlight了吗?

 回复 引用 查看   
#8楼 2007-12-11 12:00 Juzz Pig(橘子&猪)      
终于出来了。也期待你写的文章。
你的几个系列都不错。支持。

 回复 引用 查看   
#9楼[楼主] 2007-12-11 12:04 TerryLee      
@Guozhijian
提供了一些Silverlight控件,可以在ASP.NET中使用,如
<asp:MediaPlayer runat="server" ID="Media1"
ScaleMode="Stretch"
AutoPlay="true"
MediaSource="MyVideoFile.wmv"
PluginBackColor="blue"
MediaSkin="Professional"
Height="240"
Width="320" />

 回复 引用 查看   
#10楼[楼主] 2007-12-11 12:05 TerryLee      
@Juzz Pig(橘子&amp;猪)
:)

 回复 引用 查看   
#11楼 2007-12-11 12:13 高海东      
您好 我非常关注您的Web Client Software Factory和Web Service Software Factory,请问这两个系列您写完了吗 Web Service Software Factory 可以单独写一些吗
 回复 引用 查看   
#12楼[楼主] 2007-12-11 12:16 TerryLee      
@高海东
还没有,Web Client Software Factory对于Composite Web Application Block和V-P模式的使用,看前面四篇应该够了,后面我会写一些Page Flow Application Block的东西。

Web Service Software Factory需要过一段时间,时间实在太少了:)

 回复 引用 查看   
#13楼 2007-12-11 12:46 坐断东南 笑煞之!!      
TerryLee的文章总能第一时间来做我们领路人。。

TerryLee----MS学习者的领路人

呵呵,,支持个。。

 回复 引用 查看   
#14楼 2007-12-11 12:55 李永京      
MS学习者的领路人。学习MVC的好文~期待!
 回复 引用   
#15楼 2007-12-11 12:55 黄色期刊[未注册用户]
MonoRails怎么办???
 回复 引用 查看   
#16楼 2007-12-11 13:06 lovecherry      
初看了一下,有几个问题:
1、如果使用了模板页,页面标题如何绑定?
2、模板页的视图数据由谁来提供?

 回复 引用 查看   
#17楼[楼主] 2007-12-11 13:15 TerryLee      
@坐断东南 笑煞之!!
呵呵,过奖了

 回复 引用 查看   
#18楼[楼主] 2007-12-11 13:16 TerryLee      
@李永京
:)

 回复 引用 查看   
#19楼[楼主] 2007-12-11 13:29 TerryLee      
@XX期刊
关于MonoRails何去何从,可以参看这篇文章:
http://www.infoq.com/news/2007/11/mr-ms-mvc

 回复 引用 查看   
#20楼 2007-12-11 13:30 terry_12      
@lovecherry
titile可以在模板页属性中指定,
模板页数据由controller提供

 回复 引用 查看   
#21楼[楼主] 2007-12-11 13:35 TerryLee      
@lovecherry
在MVC框架下,仍然可以使用母版页。

不过母版页的视图数据如何传,还没有看到相关的内容
-------------------------------------------------
Terry-12:
void RenderView(string viewName, string masterName, object viewData)

 回复 引用 查看   
#22楼 2007-12-11 13:35 没剑      
true bird~~
 回复 引用   
#23楼 2007-12-11 13:37 东[未注册用户]
多谢分享.
 回复 引用 查看   
#24楼[楼主] 2007-12-11 13:38 TerryLee      
@terry_12
视图数据由Controller提供是肯定的。

 回复 引用 查看   
#25楼[楼主] 2007-12-11 13:39 TerryLee      
@东
:)

 回复 引用 查看   
#26楼 2007-12-11 13:40 terry_12      
@TerryLee
void RenderView(string viewName, string masterName, object viewData);

 回复 引用 查看   
#27楼 2007-12-11 13:40 lovecherry      
@terry_12
如果title是要根据URL中的参数来指定比如[catgoryID],又不想从视图数据中获取怎么办?
控制器只能渲染普通页面,如果是用户控件,由页面来加载用户控件,但是现在只有Html.RenderUserControl而没有Html.RenderMasterPage,怎么把视图数据传给模板页呢?

说实话,MVC除了强制性从控制器走请求来消除页面cs代码,其它我没有看到什么更多的好处。页面里面还会有一堆Html、Url之类的Helper方法。。。。

 回复 引用 查看   
#28楼[楼主] 2007-12-11 13:45 TerryLee      
@terry_12
晚上回去看一下

 回复 引用   
#29楼 2007-12-11 14:12 Eeyore[未注册用户]
要引用System.Web.Mvc命名空间...
 回复 引用 查看   
#30楼[楼主] 2007-12-11 14:16 TerryLee      
@Eeyore
这个当然得引用了啊:)

MonoRail……
对了,问一下,你的博客是用什么写的?word2007?

 回复 引用   
#32楼 2007-12-11 14:26 riancy[未注册用户]
不管是什么框架,我只关心项目运行的性能,
能说说这样的优势除了在开发上,还有哪里有优势?

 回复 引用 查看   
#33楼[楼主] 2007-12-11 14:35 TerryLee      
@volnet(可以叫我大V)
用Windows Live Writer写的:)

http://www.cnblogs.com/dudu/articles/495718.html

 回复 引用 查看   
#34楼[楼主] 2007-12-11 14:41 TerryLee      
@riancy
现在还不能说MVC与WebForm孰优孰劣,可以说MVC框架有点像回到了ASP的风格,只不过现在提供了一种更为严格的做法来将这种开发方式和代码逻辑区分开来。

可以参考一下《Why MVC for ASP.NET? 》这篇文章
http://www.infoq.com/news/2007/12/MVC-vs-Web-Forms

 回复 引用   
#35楼 2007-12-11 14:49 Eeyore[未注册用户]
为什么我运行出错了...-_-#!,未将对象引用设置到对象的实例。
能提供源码下载吗?

 回复 引用 查看   
#36楼[楼主] 2007-12-11 15:17 TerryLee      
@Eeyore
我晚上回去发一下源码吧

看一下你在Global.asax中的路径选择是否正确,Controller名为XXXController...

Url = "[controller]/[action].mvc",

 回复 引用 查看   
#37楼 2007-12-11 15:23 Yoshow      
上次想试下这个mvc,搞了半天. 终于发现System.Web.Extensions 版本是 3.6.0.0 我的机子上没有 今天终于盼来了 ^_^
 回复 引用   
#39楼 2007-12-11 16:54 Andy@CHY[未注册用户]
樓主可比暴雪啊,不出則已,一出必出經典啊!
頂!!

 回复 引用   
#40楼 2007-12-11 17:08 Eeyore[未注册用户]
哈,终于可以了,但怎样通过虚拟目录访问呢?
 回复 引用 查看   
#41楼[楼主] 2007-12-11 18:25 TerryLee      
@Yoshow
:)

 回复 引用 查看   
#42楼[楼主] 2007-12-11 18:25 TerryLee      
@jjx
怎么打不开呢?

 回复 引用 查看   
#43楼[楼主] 2007-12-11 18:26 TerryLee      
@Andy@CHY
呵呵,过奖了啊")

 回复 引用 查看   
#44楼[楼主] 2007-12-11 18:27 TerryLee      
@Eeyore
通过虚拟目录访问,要视IIS而定,如果是IIS6的话,需要添加.mvc扩展,其他的应该没什么变化

 回复 引用   
#45楼 2007-12-11 18:53 jijl2001[未注册用户]
只能建网站吗?能不能建application
 回复 引用 查看   
#46楼[楼主] 2007-12-11 19:09 TerryLee      
@jijl2001
可以建应用程序,我用的是Visual Web Developer 2008 Express

 回复 引用   
#47楼 2007-12-11 19:15 je[未注册用户]
route感觉不错,其它的和monorails对比,感觉没有什么太新的东西,一般学过monorails的都能平稳过渡。障碍并不多
个人感觉

 回复 引用 查看   
#48楼[楼主] 2007-12-11 19:20 TerryLee      
@je
也许现在还没有太多的让大家眼前一亮的东西,不知道MVC Framework最终会怎么样,还是拭目以待吧:)

 回复 引用 查看   
#49楼 2007-12-11 20:41 预备役中尉      
收藏学习.ERP的东西还停留在03时代.这个东西的前途如何,好象都持观望态度.
 回复 引用   
#50楼 2007-12-11 20:57 追求[未注册用户]
vs2005是不是不可以用MVC 啊???高手回复下。。小弟回头看。。谢谢
 回复 引用 查看   
#51楼 2007-12-11 21:28 jjx      
@TerryLee
可以啊,网通的, 另外浏览器编码切换成utf-8

 回复 引用 查看   
#52楼[楼主] 2007-12-11 21:29 TerryLee      
@预备役中尉
微软的说法是将会WebForm并存,至于将来怎么发展,还得继续“观望”:)

 回复 引用 查看   
#53楼[楼主] 2007-12-11 21:30 TerryLee      
@追求
ASP.NET MVC Framework是ASP.NET 3.5 Extensions的一部分,VS2005下不能使用

 回复 引用   
#54楼 2007-12-11 23:43 [心有灵犀][未注册用户]
HOHO,体验1,测试通过!!!
 回复 引用 查看   
#55楼[楼主] 2007-12-12 00:32 TerryLee      
@[心有灵犀]
呵呵,也MVC一把吧:)

 回复 引用   
#56楼 2007-12-12 01:00 Eeyore[未注册用户]
ha,下载源码看了一下,发现我们的是一样的:)
 回复 引用 查看   
#57楼 2007-12-12 08:17 Jeffery Huang      
.net 真是越来越强悍了
 回复 引用   
#58楼 2007-12-12 10:09 freesquare[未注册用户]
TerryLee 好久没有看到你的文章了啊。。。。
 回复 引用   
#59楼 2007-12-12 10:16 Alex.He[未注册用户]
我看Scott的教程可以使用ListView等控件,可是我在aspx.cs代码中没法使用前台定义的ListView控件,请问这个怎么搞。
另外,假设URL为

/Products/List/Category 列出一个分类中的产品 /Products/List/Beverages (Controller接受参数category)
/Products/Detail/ProductID 显示一个特定产品的细节 /Products/Detail/34 (Controller接受参数id)

那么URL规则该如何设置?
RouteTable.Routes.Add(new Route
{
Url = "[controller]/[action]/[id]",
Defaults = new { action = "Index", id = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});

RouteTable.Routes.Add(new Route
{
Url = "Products/List/[category]",
Defaults = new { action = "Index", category = (string)null },
RouteHandler = typeof(MvcRouteHandler)
});
这样会后面会被前面覆盖掉。

我参照的是这篇blog。
还有单元测试部分不太明白,还望大侠指点

 回复 引用   
#60楼 2007-12-12 10:17 Alex.He[未注册用户]
Controller的代码如下
[ControllerAction]
public void List(string category)
{
IList<Product> products = this.ctx.GetProductsByCategory(category);
RenderView("ListingByCategory", products);
}

[ControllerAction]
public void Detail(int id)
{
Product product = this.ctx.GetProductById(id);
RenderView("Detail", product);
}

 回复 引用 查看   
#61楼 2007-12-12 11:40 人非木      
关注关注!

 回复 引用 查看   
#62楼 2007-12-12 14:36 OnlyLiu      
MVC 有什么好处么??不明白。越搞越糊涂

 回复 引用 查看   
#63楼 2007-12-12 21:40 Hafeyang      
1.aspx中的ViewData是怎么回事?

2.public partial class Product_Product : ViewPage<ProductInfo>
如果一个页面有两个Module?


 回复 引用 查看   
#64楼[楼主] 2007-12-12 21:43 TerryLee      
@Eeyore
呵呵

 回复 引用 查看   
#65楼[楼主] 2007-12-12 21:44 TerryLee      
@Jeffery Huang
ASP.NET MVC Framework将来到底能提供多么强的功能,还不知道呢,不过按MS的风格看,应该不会太差

 回复 引用 查看   
#66楼[楼主] 2007-12-12 21:44 TerryLee      
@freesquare
8-10月份有些事情,所有就没有更新:)

 回复 引用 查看   
#67楼[楼主] 2007-12-12 21:46 TerryLee      
@Alex.He
等第四篇吧,我专门会写一篇URL路由的文章

// 我现在用的是Express版本,没法做测试的:)

 回复 引用 查看   
#68楼[楼主] 2007-12-12 21:46 TerryLee      
@人非木
:)

 回复 引用 查看   
#69楼[楼主] 2007-12-12 21:47 TerryLee      
 回复 引用 查看   
#70楼[楼主] 2007-12-12 21:49 TerryLee      
@Hafeyang
1.ViewData是传入到视图中的数据,如
RenderView("Product", productinfo);

2.如果确实有两个Module,可以用泛型集合或者再自定义一个类型往视图中传数据啊

 回复 引用   
#71楼 2007-12-13 09:35 寒江[未注册用户]
跟ruby差不多,应该借鉴了很多RUBY的架构
 回复 引用 查看   
#72楼[楼主] 2007-12-13 12:43 TerryLee      
@寒江
借鉴对于我们开发者来说未必是坏事啊:)

 回复 引用 查看   
#73楼 2007-12-13 14:09 pk的眼泪      
看看
 回复 引用   
#74楼 2007-12-13 17:21 o0myself0o[未注册用户]
这些方面我还是比较菜,很多都不会
您是否可以将using部分也写出来,这样的话就比较容易试了,或者将您的demo发布出来,谢谢了

 回复 引用   
#75楼 2007-12-13 17:26 o0myself0o[未注册用户]
看到demo了,谢谢拉~
一直关注中...

 回复 引用 查看   
#76楼[楼主] 2007-12-13 18:34 TerryLee      
@o0myself0o
using System.Web.Mvc就可以了

 回复 引用 查看   
#77楼 2007-12-13 22:10 xinzhang      
我已经下拉
回去看拉后在给你写建议

 回复 引用 查看   
#78楼[楼主] 2007-12-14 10:44 TerryLee      
@xinzhang
OK:)

 回复 引用 查看   
#79楼 2007-12-14 11:27 命运有自己的梦!      
期待正式版赶快出来,以前一直在用MonoRail开发。
 回复 引用 查看   
#80楼[楼主] 2007-12-14 13:48 TerryLee      
@命运有自己的梦!
明年2、3月份估计就出来了:)

 回复 引用   
#81楼 2007-12-14 18:29 macless[未注册用户]
怎么我的总是无法找到实例呢?我是使用IIS6的.
 回复 引用 查看   
#82楼[楼主] 2007-12-14 21:12 TerryLee      
@macless
在IIS6下需要设置.mvc扩展

 回复 引用   
#83楼 2007-12-15 01:19 o0myself0o[未注册用户]
@TerryLee
怎么设置.mvc扩展呢?

 回复 引用   
#84楼 2007-12-19 14:28 Eeyore[未注册用户]
对,怎样设置IIS扩展呢?
还有我发现了vwd express和vs2008(prof or vsts)的区别了...
就是,vs2008能新建mvc application,而vwd 只能建3.5 ext website
,在vs2008中能自动生成mvc的文件架构(如m,v,c文件夹),其中还附带例子
:)

 回复 引用   
#85楼 2007-12-22 09:40 询问[未注册用户]
vwd express 和 3.5装后,对VS2005有影响么,现在正在用2005开发,怕搞乱了。
 回复 引用   
#86楼 2007-12-23 07:45 李龙[未注册用户]
--引用--------------------------------------------------
stonezhu: 这属于需要强顶的贴子
加油!!坚持!!
--------------------------------------------------------

 回复 引用 查看   
#87楼 2008-01-08 09:03 吴祝明      
关注中,等MVC出到第三个正式版本后才开始学习~~~~~~
 回复 引用   
#88楼 2008-01-15 14:32 user123[未注册用户]
不错好东西,收藏!谢谢搂主,继续学习!!
 回复 引用   
#89楼 2008-01-28 17:03 sd[未注册用户]
ProductId:<%= ViewData.ProductId %><br />

我设置Product.aspx为初始页后,然后运行,出现"未将对象引用设置到对象的实例",我确定我连接字符串正确

 回复 引用 查看   
#90楼 2008-02-19 12:33 Tony Zhou      
ProductId:<%= ViewData.ProductId %>

我设置Product.aspx为初始页后,然后运行,出现"未将对象引用设置到对象的实例",我确定我连接字符串正确

我也是同样的问题,程序一个字没该,就是连接字符串改了,而且通过向导做的,测试过没有问题。
进不到ProductController.cs的调试页面。

 回复 引用 查看   
#91楼[楼主] 2008-02-21 19:18 TerryLee      
@Tony Zhou
你在地址栏中把.aspx修改为.mvc再试试看

 回复 引用 查看   
#92楼 2008-02-23 21:44 GoKu'S Blog      
这个3.5扩展好像装在中文2008上,找不到模板?
 回复 引用 查看   
#93楼[楼主] 2008-02-26 19:00 TerryLee      
@GoKu'S Blog
中文2008,是RTM吗?

 回复 引用   
#94楼 2008-03-25 11:24 过客007[未注册用户]
请问ASP.NET 3.5扩展将来会集成到vs.net开发环境中么?
 回复 引用 查看   
#95楼[楼主] 2008-03-25 22:18 TerryLee      
@过客007
肯定会啊,据说将来会以.NET 3.5 SP1发布。。。

 回复 引用   
#96楼 2008-04-02 14:17 张斌山[未注册用户]
我已经装了。ASP.NET 3.5 Extensions怎么还不能用呢?我用的是中文版,请楼主帮忙!谢谢
 回复 引用   
#97楼 2008-04-03 10:56 念时回复 [未注册用户]
MVC是一种开发模式吗
 回复 引用 查看   
#98楼 2008-05-14 15:07 镜涛      
学习,呵呵
 回复 引用   
#99楼 2008-07-25 09:15 流星007[未注册用户]
运行出现错误
找不到类型或命名空间名称“MSPetShopDataContext”(是否缺少 using 指令或程序集引用?)

请教楼主

 回复 引用   
#100楼 2008-07-25 09:47 流星007[未注册用户]
解决了... :-p
 回复 引用 查看   
#101楼[楼主] 2008-07-25 09:49 TerryLee      
@流星007
你用的ASP.NET MVC哪个版本?

 回复 引用 查看   
#102楼 2008-09-14 12:08 李路平      
请教楼主,我一运行
ID=<%=ViewDate.ID%>就报使用new关键字创建对象,就没运行成功过,这个是什么原因,跟我的MVC的版本有关系吗?

 回复 引用 查看   
#103楼 2008-09-15 09:43 李路平      
能回答我下ASP.NET 3.5 Extensions Web Application和ASP.NET MVC framework (Codeplex Preview 5)的区别吗?他们的MVC是不是同一个东西啊,我想研究下MVC先装的Extensions Web Application照着做半天出不来东西,后来想下最新版,所以安了Codeplex Preview 5,但是怎么两个MVC区别挺大的,比如[ControllerAction]这些又没有,是怎么回事?能帮我解释一下吗?
 回复 引用 查看   
#104楼[楼主] 2008-09-17 00:43 TerryLee      
@李路平
Codeplex Preview 5是最新的,请使用这个版本。[ControllerAction]在最新版本中已经不支持了:)

 回复 引用 查看   
#105楼 2009-12-14 19:58 戴超      
欢迎各位加入ASP.NET MVC框架超级群!让我们共同学习、进步!ASP.NET MVC一群:40985466人员已满!请其他有兴趣的朋友加ASP.NET MVC二群:14426077(同样可容纳500人的超级群!) 另群:49544745已作为PHP群使用!请慎重加入!欢迎大家的加入!
非常乐意为大家提供一个良好的交流平台!

 回复 引用 查看   
#106楼 2010-11-28 03:34 manimanihou      
引用戴超:
欢迎各位加入ASP.NET MVC框架超级群!让我们共同学习、进步!ASP.NET MVC一群:40985466人员已满!请其他有兴趣的朋友加ASP.NET MVC二群:14426077(同样可容纳500人的超级群!) 另群:49544745已作为PHP群使用!请慎重加入!欢迎大家的加入!
非常乐意为大家提供一个良好的交流平台!


the north face outlet 96 north face windbreaker 96 northface outlet

楼层太高了。。

评论共2页: 上一页 1 2