首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

探索 ASP.NET MVC4 Developer Preview,该怎么处理

2011-12-29 
探索 ASP.NET MVC4 Developer Preview在 Visual Studio 11 Developer Preview 里,并没有集成 ASP.NET MVC4

探索 ASP.NET MVC4 Developer Preview
在 Visual Studio 11 Developer Preview 里,并没有集成 ASP.NET MVC4 Developer Preview,事实上,它根本没有带任何版本的 ASP.NET MVC 框架。不过不要紧,VS11 提供了一个 Web Installer 的链接,通过它就可以下载到 ASP.NET MVC4 的开发者预览版。如果你的电脑上网不便,或者连接官方的服务器太慢,也可以从这里下载离线安装程序:http://download.csdn.net/detail/caozhy/3619212。注意,只有Visual Studio 2010 SP1和
Visual Studio 11 Developer Preview支持MVC4 Preview。安装对应的安装包即可。

安装之后,我初步体验了下这个新框架的一些新特性,分享给大家。



这张图表明 MVC4 的2个新特性,一个是支持移动应用,另一个是支持 HTML5,而 HTML5 的支持,来自基于 ASP.NET 4.5 的新特性。

在新建一个带用户帐户支持的新程序,可以看到如下运行效果:



ASP.NET MVC 4默认的模板有了更新,改变了自MVC1以来的面孔。而且登录、注册也换成了jQueryUI的AJAX的风格。

然而不止于此,默认的视图模板也增加了对Ajax风格的支持:



虽然在实际开发中,这些脚手架代码很少被实际使用。也许你也这么认为,不错,微软也想到了,现在 MVC4 新增了一个叫 Recipe 的东西。

看下图:


那么什么是 Recipe 呢?按照微软的解释,它是一种智能的代码生成插件,当你需要一个功能的时候,一个 Recipe 组件就可以通过 API 和 Visual Studio 交互,并且正确插入和更新代码,使得程序支持这个功能,插入的代码可能分散在程序的多个地方。

而且 Recipe 是可以扩展的,因此和那些一次性的脚手架相比,这个就实用多了。用过 VC++ 6 的人可能感觉它和 Component Gallery 有点像,呵呵。

MVC4 还改进了异步控制器调用,其实这个特性是 MVC2 新增的。但是因为缺少异步语法的支持,以前写一个异步 Action 需要2个方法才能实现。现在借助 async/await,只需要一个方法就行了。

我还体验了下用 MVC4 开发的过程。我们的目标是设计一个简易的 RSS 阅读器,它从我们预先选定的几个网站获取数据,并且按照时间排序后呈现出来,当数据很多的时候,我们只显示前100条。

为此,首先创建模型:

C# code
public class NewsItem{    public DateTime PostDate { get; set; }    public string Title { get; set; }    public string SourceURL { get; set; }    public string Content { get; set; }}


然后编写一个方法获取RSS数据:

C# code
public class NewsModels{    public static async Task<List<NewsItem>> GetNews(string RssURI)    {        var x = XElement.Load(RssURI);        DateTime _out = default(DateTime);        return x.Element("channel").Elements("item")            .Select(y => new NewsItem() {                Content = (y.Element("description") ?? new XElement("description")).Value,                PostDate = DateTime.TryParse((y.Element("pubDate") ?? new XElement("pubDate", default (DateTime))).Value, out _out) ?                                DateTime.Parse((y.Element("pubDate") ?? new XElement("pubDate", default (DateTime))).Value) :                                default(DateTime),                SourceURL = (y.Element("link") ?? new XElement("link")).Value,                Title = (y.Element("title") ?? new XElement("title")).Value            }).ToList();    }}

然后设计视图:

C# code
@model IEnumerable<MvcApplication1.Models.NewsItem>@{    ViewBag.Title = "News";}用时 @ViewBag.TimeCost@foreach (var item in Model) {    <h2>@item.Title</h2>        <p>@item.PostDate</p>    <p><a href="@item.SourceURL" target="_blank">@item.SourceURL</a></p>    <p>@MvcHtmlString.Create(item.Content)</p>        <p />}


在 Razor 引擎下,编写视图的代码很清爽。

之后是控制器代码,为了体验异步动作,首先需要将我们的控制器从 AsyncController 继承。
C# code
public class HomeController : AsyncController


然后我们就可以使用async/await语法了。



C# code
public async Task<ActionResult> NewsAsyncAsync(){    DateTime dt1 = DateTime.Now;    var rss = new string[]         {            "http://articles.csdn.net/api/rss.php?tid=1008",            "http://aspnet.codeplex.com/project/feeds/rss",            "http://solidot.org.feedsportal.com/c/33236/f/556826/index.rss",            "http://www.codeguru.com/icom_includes/feeds/codeguru/rss-csharp.xml",            "http://feed.google.org.cn/"        };    List<List<NewsItem>> list = new List<List<NewsItem>>();    foreach (var item in rss)    {         List<NewsItem> news = await (NewsModels.GetNews(item));        list.Add(news);    }    var model = list.SelectMany(x => x)                    .ToList()                    .OrderByDescending(x => x.PostDate)                    .Take(100);    DateTime dt2 = DateTime.Now;    ViewBag.TimeCost = new TimeSpan(dt2.Ticks - dt1.Ticks).ToString();    return View("News", model);} 


TimeCost将报告动作耗费的时间。

我们还可以为动作标注一些特性,比如设置超时:
C# code
[AsyncTimeout(2500)]


根据 MVC 的约定,一个方法叫 xxxAsync 的动作,对应来自 xxx 的请求。
所以 http://host/ControllerName/ActionName 的访问,对应的动作应该命名为 ActionNameAsync()。

我们也可以在异步控制器里面使用同步动作:
C# code
        public ActionResult NewsSync()        {            DateTime dt1 = DateTime.Now;            var rss = new string[]                 {                    "http://articles.csdn.net/api/rss.php?tid=1008",                    "http://aspnet.codeplex.com/project/feeds/rss",                    "http://solidot.org.feedsportal.com/c/33236/f/556826/index.rss",                    "http://www.codeguru.com/icom_includes/feeds/codeguru/rss-csharp.xml",                    "http://feed.google.org.cn/"                };            var model = rss.SelectMany(x => NewsModels.GetNews(x).Result)                           .ToList()                           .OrderByDescending(x => x.PostDate)                           .Take(100);            DateTime dt2 = DateTime.Now;            ViewBag.TimeCost = new TimeSpan(dt2.Ticks - dt1.Ticks).ToString();            return View("News", model);        }


异步动作返回的是一个 Task<ActionResult> 的类型。

程序运行效果:


关于异步方法使用的动机,微软给出如下建议:

In general, use synchronous pipelines when the following conditions are true:
 
The operations are simple or short-running.


Simplicity is more important than efficiency.


The operations are primarily CPU operations instead of operations that involve extensive disk or network overhead. Using asynchronous action methods on CPU-bound operations provides no benefits and results in more overhead.

 
In general, use asynchronous pipelines when the following conditions are true:
 
The operations are network-bound or I/O-bound instead of CPU-bound.


Testing shows that the blocking operations are a bottleneck in site performance and that IIS can service more requests by using asynchronous action methods for these blocking calls.


Parallelism is more important than simplicity of code.


You want to provide a mechanism that lets users cancel a long-running request.

总的来说就是,耗时、存在网络或者IO延迟、需要并行计算、提高性能的情况下,至于“Parallelism is more important than simplicity of code.”现在已经过时了,因为代码简洁和异步并行现在可以兼得了。

完整的程序在此:http://download.csdn.net/detail/caozhy/3620415,除了文章提到的内容,其余均是 MVC4 模版默认的代码。

[解决办法]
赞,越来越给力了
[解决办法]
顶啊...
[解决办法]
概念产品,应用价值不高
[解决办法]
更新这么快啊,怎么让人用……
[解决办法]
That's awesome.
[解决办法]
赶上了4.0和MVC3.0
对4.5的framework和MVC4.0表示淡定 多谢LZ提醒 微软更新速度果然是太快了
[解决办法]
html5亮点哦 希望IE全面兼容html5 那样工作就轻松了许多 呵呵
[解决办法]
MVC3都没开始去整- -
就出MVC4了
MS啊!!
[解决办法]
好。。。。。不错、、、、
------解决方案--------------------


什么时候视图引擎里能有jquery template就好了
[解决办法]
不错,关注一下
[解决办法]
学习。
[解决办法]
收藏,以后有空学习下
[解决办法]

[解决办法]
留个名,中午吃饭时看。
[解决办法]
什么时候视图引擎里能有jquery template就好了
[解决办法]
e额 看来跟不上了呀
[解决办法]
前沿的技术,真正要用到这个至少要等2-3年后了
[解决办法]
看来要学习LINQ才行
[解决办法]
不错,关注一下
[解决办法]
够速度。
[解决办法]

很强大。。。
[解决办法]
MS相信世界末日说,再不出 就没机会了。所以一个屁把mvc1 2 3 4全拉出来了!
[解决办法]
都用2011了,用VS6.0的飘过,表示压力很大。
[解决办法]

[解决办法]
这次升级很给力呀
[解决办法]
跟着微软跑好累,。。。。。。。。。。
[解决办法]
更新速度还是蛮快的...
[解决办法]
真是累 一个没熟 下一个又来了
[解决办法]
支持……
[解决办法]
不是很懂

[解决办法]
顶一顶很健康!
[解决办法]

热点排行