ASP.NET MVC Performance Tips(1):RenderPartial性能优化

背景

在ASP.NET MVC中,HtmlHelper的扩展方法RenderPartial为我们使用UserControl带来了极大的方便,当我们指定一个UserControl时,RenderPartial会在当前View文件夹下查找相应的UserControl,如果没有找到则会到Shared文件夹下查找。然后在使用RenderPartial方法有一些性能方面的考虑,值得我们去关注。

设想有这样一个场景,一篇文章有很多个评论,在页面中我们需要呈现出一个评论列表,自然我们会定义一个评论的UserControl,如下代码所示:

Code 1:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Comment>" %>
<%@ Import Namespace="TerryLee.MvcPerformance01.Models" %>
<p>
    ID: <%=Model.ID %> <br />
    Author: <%=Model.Author %> <br />
    Description: <%= Model.Description %>
</p>
<hr />

在页面中呈现评论列表,代码非常简单,仅仅是遍历所有的评论而已:

Code 2:

<div>
   <%
     foreach (var comment in Model.Comments)
     {
         Html.RenderPartial("CommentsItem", comment);
     }
  %> 
</div>

运行后效果如下,可以看到正确的输出了评论:

aspnetmvc_performance_tips_001 

性能优化1

然而当我们同时输出200条评论的时候, 却要花费大量的时间,用Stopwatch来测量一下会发现,输出200条评论花费的时间基本在210ms左右,也就是说平均每条评论的输出花费了1ms。我们不妨看一下ASP.NET MVC的源代码,在WebFormViewEngine中当查找UserControl时,遵循如下查找模式:

Code 3:

public WebFormViewEngine() {
    MasterLocationFormats = new[] {
        "~/Views/{1}/{0}.master",
        "~/Views/Shared/{0}.master"
    };

    ViewLocationFormats = new[] {
        "~/Views/{1}/{0}.aspx",
        "~/Views/{1}/{0}.ascx",
        "~/Views/Shared/{0}.aspx",
        "~/Views/Shared/{0}.ascx"
    };

    PartialViewLocationFormats = ViewLocationFormats;
}

所以如果我们在RenderPartial方法中,指定了UserControl的完全路径,是不是可以避免这个查找过程呢?修改Code 2代码如下所示:

Code 4:

<div>
   <%
       foreach (var comment in Model.Comments)
       {
           Html.RenderPartial("~/Views/Shared/CommentsItem.ascx", comment);
       }
     %> 
</div>

现在再测试一下会发现呈现200条评论的时间平均值保持在10ms左右,比前面的方式提升了近200ms。然而我们是否真的找到了解决问题的方法?ASP.NET MVC难道不对查找的View路径进行缓存?带着这样的疑问,我们在ASP.NET MVC源代码VirtualPathProviderViewEngine的构造函数中,找到这样一段代码:

Code 5:

protected VirtualPathProviderViewEngine() {
    if (HttpContext.Current == null || HttpContext.Current.IsDebuggingEnabled) {
        ViewLocationCache = DefaultViewLocationCache.Null;
    }
    else {
        ViewLocationCache = new DefaultViewLocationCache();
    }
}

这里的判断说明如果启用了Debug模式,将会使用NullViewLocationCache,即不进行缓存,否则会使用DefaultViewLocationCache对View路径进行缓存。所以上面的测试结果都是基于Debug模式:

Code 6:

<compilation debug="true">

如果关闭了Debug模式,测试结果又该如何呢?使用下面代码关闭Debug模式:

Code 7:

<compilation debug="false">

再次进行测试,会发现使用Code 2代码呈现200条评论时,花费的时间平均值也是在10ms左右。所以在使用RenderPartial方法时,大可不必为了提升性能而指定UserControl的完全路径,ASP.NET MVC已经为我们做好了这一切,我们要做的仅仅是在发布到生产环境时,别忘了关闭Debug模式!在本示例中,开启Debug和关闭Debug模式在一次调用时的性能差距如下图所示:

aspnetmvc_performance_tips_002 

性能优化2

现在回过头来看前面的代码,其实并没有做什么性能优化,仅仅时给大家提个醒而已。在Code 2中,我们的遍历代码放在了主页面中,即在每一次迭代中调用RenderPartial方法,尽管ASP.NET MVC在RenderPartial时,对于UserControl路径做了缓存,但是200次的调用仍然有不小的开销。如果我们的遍历代码放在UserControl中,而在主页面中只进行一次调用RenderPartial方法,结果又将如何呢?修改UserControl为下代码所示:

Code 8:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<Comment>>" %>
<%@ Import Namespace="TerryLee.MvcPerformance01.Models" %>
<%
    foreach(Comment comment in Model)
    {
 %>
<p>
    ID: <%= comment.ID%> <br />
    Author: <%= comment.Author%> <br />
    Description: <%= comment.Description%>
</p>
<%} %>
<hr />

这样在主页面中,只进行一次RenderPartial调用,如下代码所示:

<div>
   <%
     Html.RenderPartial("CommentsItem", Model.Comments);
   %> 
</div>

此时再次测试,可以看到呈现200条评论所花费的时间不足1ms!为了直观期间,我们仍然使用图形表示如下:

aspnetmvc_performance_tips_003 

从上图中可以看到,通过在UserControl中进行遍历,减少RenderPartial方法调用,带来的性能提升还是非常可观的。

总结

本文主要讨论在ASP.NET MVC中使用RenderPartial方法时的一些性能问题,记住两点:一是在ASP.NET MVC应用程序发布到生产服务器时,别忘了关闭Debug模式(对于ASP.NET WebForm应用程序也是一样);二时尽可能的减少调用RenderPartial方法的次数,如通过在UserControl中进行遍历等方法。希望对大家有用。

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

评论共2页: 上一页 1 2 
 回复 引用 查看   
#8楼[楼主] 2009-05-08 08:55 TerryLee      
@DiryBoy
欢迎常来坐沙发,呵呵 :)

 回复 引用 查看   
#9楼[楼主] 2009-05-08 08:56 TerryLee      
@john.geng
这个没关系,一个Page输出的Module终究是少量有限的,不会上百的输出,所以这种循环影响不大。

 回复 引用 查看   
#10楼[楼主] 2009-05-08 08:57 TerryLee      
@oec2003
早啊 :)

 回复 引用 查看   
#11楼[楼主] 2009-05-08 08:58 TerryLee      
@李永京
呵呵,ASP.NET MVC从来也没放下啊 :)

 回复 引用 查看   
#12楼 2009-05-08 08:59 冰凝零点      
Debug威力这么大。。继续关注
 回复 引用 查看   
#13楼[楼主] 2009-05-08 08:59 TerryLee      
@任力
惭愧,呵呵 ⊙﹏⊙

 回复 引用 查看   
#14楼[楼主] 2009-05-08 08:59 TerryLee      
@重典
多谢重典兄支持 :)

 回复 引用 查看   
#15楼[楼主] 2009-05-08 09:00 TerryLee      
@5254341
其实在很多地方都会有影响,不管是ASP.NET MVC还是ASP.NET WebForm,都一样。

 回复 引用 查看   
#16楼[楼主] 2009-05-08 09:01 TerryLee      
@冰凝零点
主要是如果是Debug模式,ASP.NET MVC在有些地方会采取不同的策略,如果不是Debug模式,会有一些优化的。

 回复 引用 查看   
#17楼 2009-05-08 09:06 冰凝零点      
太好了,学到了一种编程思想,希望大哥以后多写一些
 回复 引用   
#18楼 2009-05-08 09:17 xixihaha[未注册用户]
好文。
收藏了,睡不着就翻出来看看。 - -#

 回复 引用 查看   
#19楼 2009-05-08 09:25 第一控制.NET      
正常情况下,应该没人会在循环里面调用RenderPartial吧。。。
 回复 引用 查看   
#20楼[楼主] 2009-05-08 09:26 TerryLee      
@冰凝零点
:-)

 回复 引用 查看   
#21楼[楼主] 2009-05-08 09:26 TerryLee      
@xixihaha
呵呵,欢迎收藏 :)

 回复 引用 查看   
#22楼 2009-05-08 09:27 Aggron      
学习了
 回复 引用 查看   
#23楼[楼主] 2009-05-08 09:27 TerryLee      
@第一控制.NET
也不是,我就多次看到过在循环中调用RenderPartial,包括一些开源项目中。

 回复 引用 查看   
#24楼[楼主] 2009-05-08 09:27 TerryLee      
@Aggron
:-)

 回复 引用 查看   
#25楼 2009-05-08 09:29 重典      
@TerryLee
我就研究过循环里循环外的问题。。。。
惭愧一下

 回复 引用   
#26楼 2009-05-08 09:35 lvlin[未注册用户]
那个性能图是怎么得出来的?需要哪些步骤和技术?
 回复 引用 查看   
#27楼[楼主] 2009-05-08 09:42 TerryLee      
@重典
呵呵,重典兄太客气了,下次俱乐部聚会上好好交流一下 :P

 回复 引用 查看   
#28楼[楼主] 2009-05-08 09:43 TerryLee      
@lvlin
呵呵,那个图是Excel画出来的 :)

 回复 引用 查看   
#29楼 2009-05-08 10:15 第一控制.NET      
@TerryLee
是么。。。反正打死我,我也不回这么调的。呵呵。

 回复 引用 查看   
#30楼 2009-05-08 10:17 侯垒      
好久不见了。
 回复 引用 查看   
#31楼 2009-05-08 10:20 Dreaming      
Terry兄终于出手了,看前面的时候正郁闷为什么不在UserControl中遍历,原来好戏在后头,其实无论是不是MVC,关闭Debug都是会提高性能的。

另外请问Terry兄,在多个页面都调用这个UserControl的话,有什么好解决方案?不会是每个controller都要写代码去传值吧?现在有一办法是自行写个抽象类去继承Controller,然后每个新的Controller都去记得那个自定义Controller,但这样例如我做post操作等(跟页面展示没关系的),都要去处理逻辑->传值,那样是不是也浪费资源了?

 回复 引用 查看   
#32楼 2009-05-08 10:23 AlexLiu      
老大你打算各个击破是么。怪物啊。!!!
 回复 引用 查看   
#33楼 2009-05-08 10:24 Nick Wang (懒人王)      
Terry又出山了,看来书是快要出版了
 回复 引用 查看   
#34楼 2009-05-08 10:26 金色海洋(jyk)      
我想问一下老大的测试环境。

因为我最近也在做性能测试,我使用GridView自动生成字段的方式来显示数据。

我显示的是25行5列的数据,每一行都很简单,40个字符左右,

a = Environment.TickCount ;
for (int i = 0; i < 1000; i++)
{
GV.DataBind();
}
b = Environment.TickCount - a;

我用这个方式测试了一下,结果是390毫秒左右,如果只绑定一次的话只需要0.39毫秒。


我是Dell的笔记本,CPU:core2 7250 2.0G。

只是在自己的本本上测试,没有对比,也不是道速度到底快不快,正赶上老大也在做测试,所以想对比一下。


 回复 引用 查看   
#35楼 2009-05-08 10:31 高天蒲      
有没有一个

轻量级的,开源的,html模板替换引擎?推荐一下?

 回复 引用 查看   
#36楼 2009-05-08 11:15 Jun1st      
Nice
 回复 引用 查看   
#37楼[楼主] 2009-05-08 11:19 TerryLee      
@第一控制.NET
嗯嗯……

 回复 引用 查看   
#38楼[楼主] 2009-05-08 11:20 TerryLee      
@侯垒
好久不见,其实我一直在园子里 :)

 回复 引用 查看   
#39楼[楼主] 2009-05-08 11:23 TerryLee      
@Dreaming
嗯,在ASP.NET WebForm中也是一样。

这个问题其实是模块的划分,或者说划分的粒度粗细如何,如果多个View中要用到该UserControl,Model也应该有某种联系才对,多个View对应的应该是同一个Controller,划分的合理的话,所以应该不会涉及到多个地方进行处理。

 回复 引用 查看   
#40楼[楼主] 2009-05-08 11:25 TerryLee      
@AlexLiu
⊙﹏⊙b汗,ASP.NET MVC从来没说不用啊~~

 回复 引用 查看   
#41楼[楼主] 2009-05-08 11:25 TerryLee      
@Nick Wang (懒人王)
已经出版了,呵呵,下周可以在网上购买 :)

 回复 引用 查看   
#42楼[楼主] 2009-05-08 11:27 TerryLee      
@金色海洋(jyk)
我也是Dell的笔记本,CPU:Core2 8400,3M二级缓存, 4G RAM。

 回复 引用 查看   
#43楼[楼主] 2009-05-08 11:29 TerryLee      
@高天蒲
这个你可以关注一下http://mvccontrib.codeplex.com/

NVelocity不知道现在还有没有发展。。

 回复 引用 查看   
#44楼[楼主] 2009-05-08 11:30 TerryLee      
@Jun1st
:)

 回复 引用 查看   
#45楼 2009-05-08 12:28 紫色永恒      
额啊啊啊啊 等书中。。。
 回复 引用 查看   
#46楼 2009-05-08 12:37 AchieveLuo      
爱教了:)
 回复 引用 查看   
#47楼 2009-05-08 13:06 AlexLiu      
老大,你那个sl去年夏天还说送我一本呢!!哈哈
 回复 引用 查看   
#48楼 2009-05-08 13:08 金色海洋(jyk)      
果然是老大,笔记本都这么狠。我也是4G内存,我拿出来2G做的虚拟硬盘,感觉速度能够快一点。
 回复 引用 查看   
#49楼 2009-05-08 13:19 妖居      
很深入啊,虽然我一直使用的就是 在UserControl中循环 的方法,但是没有这么深入的分析。
 回复 引用 查看   
#50楼 2009-05-08 14:05 一抹微蓝      
李老大的文笔风格浅入深出,非常受用。
 回复 引用 查看   
#51楼 2009-05-08 14:08 jasonyun      
呵呵,第50条评论
 回复 引用   
#52楼 2009-05-08 15:37 小鬼00[未注册用户]
Html.RenderPartial("CommentsItem", comment);
这个特性不错,迟点加到我自己的MVC里.

 回复 引用   
#53楼 2009-05-08 15:38 小鬼00[未注册用户]
@一抹微蓝
你是在表扬还是在损人?

 回复 引用 查看   
#54楼[楼主] 2009-05-08 16:11 TerryLee      
@紫色永恒
快了快了,马上就可以买到 :)

 回复 引用 查看   
#55楼[楼主] 2009-05-08 16:14 TerryLee      
@AchieveLuo
:)

 回复 引用 查看   
#56楼[楼主] 2009-05-08 16:15 TerryLee      
@AlexLiu
等我书到手了送你 :P

 回复 引用 查看   
#57楼[楼主] 2009-05-08 16:15 TerryLee      
@金色海洋(jyk)
呵呵,这个不算太狠吧 :P

 回复 引用 查看   
#58楼[楼主] 2009-05-08 16:16 TerryLee      
@妖居
呵呵,经常看看ASP.NET MVC的源代码,能够发现很多有价值的信息。

 回复 引用 查看   
#59楼[楼主] 2009-05-08 16:17 TerryLee      
@一抹微蓝
这……

 回复 引用 查看   
#60楼[楼主] 2009-05-08 16:18 TerryLee      
@jasonyun
⊙﹏⊙

 回复 引用 查看   
#61楼[楼主] 2009-05-08 16:19 TerryLee      
@小鬼00
嗯嗯,ASP.NET MVC中的很多优秀思想还是不错的 :)

// 啥时候把你的MVC框架也拿出来分享一下

 回复 引用 查看   
#62楼 2009-05-08 17:03 李中华      
以后要多来逛逛,看看高手写的东西,对自己还是有很多好处的啊。
 回复 引用   
#63楼 2009-05-08 17:36 初学者001[未注册用户]
你好TerryLee :

我是asp.net 的初学者,现在正学习分层方面的东西,在研究PetShop,看到你博客里写了很多关于 框架方面的东西,像Castle ActiveRecord 什么得,按我现在的水平有必要学习这些东西吗?
还有就是推荐点学习分层架构方面的东西。
最后一个请求就是希望老大有时间的时候,能写点针对我们这些初学者学习.net 的过程指导,以怎样一个过程一步一步的来学习.net,尤其是在掌握了.net 的基本知识后,想再学习点东西,感觉有很多的东西要学,有点无从下手的感觉!谢谢了!



 回复 引用   
#64楼 2009-05-08 17:46 bluesky875
sf
最近来看看,确实不错!!

 回复 引用 查看   
#65楼 2009-05-08 17:51 阿牛      
谢谢分享,以后注意 。
 回复 引用   
#66楼 2009-05-08 17:53 重典
发贴索书…
 回复 引用   
#67楼 2009-05-08 17:53 重典
发贴索书…
 回复 引用   
#68楼 2009-05-08 21:42 EricPoon[未注册用户]
很好。是时候对MVC做下练习。感谢分享。
如果MVC中使用NHibernate会不会很碍事,因为MVC中可以直接使用Linq To SQL。

 回复 引用 查看   
#69楼 2009-05-09 15:11 ddda      
学习
 回复 引用 查看   
#70楼 2009-05-12 22:14 C哈      
坐个沙发,学习一下
 回复 引用 查看   
#71楼[楼主] 2009-05-15 09:38 TerryLee      
@李中华
欢迎常来 :)

 回复 引用 查看   
#72楼[楼主] 2009-05-15 09:40 TerryLee      
@初学者001
1. 像Castle ActiveRecord 这类的框架性的东西,不着急去学习,还是先打好基础比较重要。

2. 第二个话题有时间了,可以考虑写一下,或者你可以发邮件给我 :)

 回复 引用 查看   
#73楼[楼主] 2009-05-15 09:40 TerryLee      
@bluesky875
:)

 回复 引用 查看   
#74楼[楼主] 2009-05-15 09:41 TerryLee      
@阿牛
别客气 :)

 回复 引用 查看   
#75楼[楼主] 2009-05-15 09:41 TerryLee      
@重典
这…… -_-

 回复 引用 查看   
#76楼[楼主] 2009-05-15 09:42 TerryLee      
@EricPoon
ASP.NET MVC是一个表现层方面的框架,跟数据访问使用LINQ to SQL 或者NHibernate没多大关系,所以不会影响。

 回复 引用 查看   
#77楼[楼主] 2009-05-15 09:43 TerryLee      
@ddda
:)

 回复 引用 查看   
#78楼[楼主] 2009-05-15 09:43 TerryLee      
@C哈
欢迎常来沙发 :)

 回复 引用   
#79楼 2009-05-15 16:42 chenpusn[未注册用户]
支持!受益匪浅!
 回复 引用 查看   
#80楼[楼主] 2009-05-18 11:22 TerryLee      
@chenpusn
:)

 回复 引用   
#81楼 2009-05-18 13:27 JeffreyChan[未注册用户]
为什么一定去遍历所有的用户控件呢,直接在用户控件里面把数据全部显示出来就行了,就只要查找一遍。这样来说性能有点牵强。直接觉得把数据全部显示出来不好,可以通过数据库分页。如果觉得再觉得不好,可以缓存。始终觉得没有探讨RenderPartial()这个性能问题,不如写一点MVC和WEBFROM的结合。
 回复 引用 查看   
#82楼[楼主] 2009-05-19 16:35 TerryLee      
@JeffreyChan
性能问题不是RenderPartial方法引起的,而是使用不当可能会引起性能问题,在本文中已经阐述的非常清楚了,估计你没有仔细看本文第二部分。

 回复 引用 查看   
#83楼 2009-05-19 16:51 imbob      
@TerryLee
楼主的文章很简单易懂,起到了拨云见日的效果,而且用词比较专业(感情色彩太浓的文章会影响读者的客观判断,或强烈反对或强烈赞成)

No.1当之无愧

 回复 引用 查看   
#84楼 2009-05-19 17:11 Jeffrey Chan      
你说的是Debug模式?开发中Debug="true“,发布以后,Debug="false",我觉得这很正常呀。从你的标题是说的RenderPartial性能优化,不如改为Debug模式对RenderPartial的影响?第二部我看了的,只是觉得当发布以后,Debug="false"的应该的。就没有关注,所以把问题放到RenderPartial上面去了。好久写一些WebFrom与MVC的结合吧?这几天在看Kigg,看到有点头痛,很讨厌IOC。PS:CompanyFeeds是MVC与WebFrom的结合,Kigg不是。
 回复 引用 查看   
#85楼[楼主] 2009-05-19 19:17 TerryLee      
@imbob
谢谢,有些汗颜 :P

 回复 引用 查看   
#86楼[楼主] 2009-05-19 19:21 TerryLee      
@Jeffrey Chan
嗯,第一部分关于Debug模式,只想通过这个告诉大家,不关闭Debug模式会带来很大的性能问题;第二部分也是很多人容易犯的错误,如果没有记错的话,Kigg当时就是把UserControl放在了迭代中,后来才重构的。

关于ASP.NET MVC和WebForm的结合意义倒不是很大,其实它们俩也从来没有分开,比如ASP.NET MVC中的View仍然使用WebForm进行呈现;倒是在ASP.NET MVC中一些优秀的思想如何在WebForm中体现值的考虑,如ModelBinding机制等。

 回复 引用 查看   
#87楼 2009-05-19 20:37 Jeffrey Chan      
ModelBinding有先天的缺陷,他的过滤器比较不错,值得在WEBFROM里面使用。期WEBFORM 4.0里面的改进吧。ASP.NET MVC目前为止只是轻量型框架,里面的源代码值得学习呀。不过还没有看,失败。能结合也不错,相互利用嘛。意义还是有的。MVC主要为了可测试性。并不算是真正意义的三层。
 回复 引用 查看   
#88楼[楼主] 2009-05-22 13:42 TerryLee      
@Jeffrey Chan
ModelBinder有先天的缺陷?又钻牛角尖了,呵呵,建议仔细理解一下老赵那两篇文章的内容吧。

 回复 引用 查看   
#89楼 2009-05-25 12:44 Jeffrey Chan      
呵呵,看了的。目前的没有此方面的需求,有需求的再去认真拜读吧。多半是我钻牛角尖了。那你写一些MODEBIND这些的东东吧?我现在还是把精力放到ASP。NET上面的。
 回复 引用 查看   
#90楼 2009-06-04 01:21 EricZhang(T2噬菌体)      
不错不错,受教了
 回复 引用 查看   
#91楼 2009-06-12 13:55 上山打老虎      
多写点吧,最好是按着实际开发中会碰到的问题。
现在的一些文章都是很基本操作的说明。没有深入说明其原理。
像博主这么讲解使用原因的好文章真是太少了。
期待~

 回复 引用   
#92楼 2009-06-19 02:32 southsiberia[未注册用户]
王者归来!!!
 回复 引用 查看   
#93楼 2009-06-24 15:14 xhx(小新)      
学习
 回复 引用   
#94楼 2009-07-05 04:48 新余论坛[未注册用户]
厉害哦
 回复 引用 查看   
#95楼 2009-07-10 13:15 1231.net      
这种小Tip正是我们所需要的~
谢谢~

 回复 引用 查看   
#96楼 2009-07-14 17:52 Ss_Andy      
不错..
希望博主多写一些解释mvc源码文章!

 回复 引用 查看   
#97楼 2009-07-16 11:02 Sonven      
引用第一控制.NET:正常情况下,应该没人会在循环里面调用RenderPartial吧。。。

呵呵,讲的对!支持

 回复 引用   
#98楼 2009-07-26 07:59 shuhaoc[未注册用户]
[img]http://online.cumt.edu.cn[/img]

学习一下

 回复 引用 查看   
#99楼 2009-08-01 21:13 郑希强      
不错
 回复 引用 查看   
#100楼 2009-08-13 12:18 skydau      
索至科技
域名空间-索至科技

索至科技长期服务于信息化与电子产业化前沿高科技阵地,拥有一支业内资深的软件开发人员、专业美工设计人员、工程技术人员以及高素质的技术团队,主要技术员工均有三年以上的行业工作经验,凭借自身强大的技术力量、丰富的项目策划经验、完善的运营模式,致力于为众多的企业或个人提供电子商务解决方案和办公系统建设交流服务。团队自成立以来,以高科技为起点、以技术为核心,秉承稳固与发展、求实与创新的精神,致力于提供基于Internet、Intranet以及电子商务等全方位的网络建设、软件开发、系统集成等技术的交流与合作平台,在为实现企业价值最大化的过程中,实现了自身的价值的提升,取得了最大程度的技术交流进展,并获得了社会各界的广泛赞誉和认同。

 回复 引用 查看   
#101楼 2009-09-08 19:02 number      
楼主很强大
 回复 引用 查看   
#102楼 2009-10-13 23:09 我-大熊      
感谢楼主的提醒,如果没有改debug这个属性在很多时候都会很影响性能和,不仅在此
 回复 引用   
#103楼 2009-11-16 11:49 choy[未注册用户]
@oec2003
COMPTIA.你可以自己BAIDU GOOGLE一下 好不好再来联系我们 QQ:962965688 近期PYTHON培训比较热门.你也可以去看以下 http://www.pythonpeixun.com 另外SERVER+的话考出来可以去IBM就业的.

 回复 引用 查看   
#104楼 2009-11-29 14:10 大白      
呵呵:
楼主:
请问:Html.RenderAction 和 Html.RenderPartial本质差别以及性能差别等。有空写个么?我觉得,做页面的时候,用renderaction,可以减少构建复杂model页面的麻烦。而转为由细小的粒度去做。比如RenderAction,输出一个html片段。这样,不用在页面上写什么for之类的,都统一到用户控件界面上。这样也有利于美工修改页面。
当然,有的时候,可能也要再去修改ascx文件,但这样比较方便很多。而且,用的时候,可以任意组合。加入Html.RenderAction 。
而不用再去修改controller里的逻辑。

 回复 引用 查看   
#105楼 2009-12-14 01:18 戴超      
想问下老大!一个*.aspx这样的view要包含多个*.ascx怎么做?这多个*.ascx控件里面有新闻列表 会员列表 产品列表 公告列表 地区列表等等!这样的应该怎么操作?望老大解决!不胜感激!
 回复 引用 查看   
#106楼 2009-12-14 19:49 戴超      
欢迎各位加入ASP.NET MVC框架超级群!让我们共同学习、进步!ASP.NET MVC一群:40985466人员已满!请其他有兴趣的朋友加ASP.NET MVC二群:14426077(同样可容纳500人的超级群!) 另群:49544745已作为PHP群使用!请慎重加入!欢迎大家的加入!
非常乐意为大家提供一个良好的交流平台!

 回复 引用 查看   
#107楼 2010-02-28 14:42 ‰流浪※      
好文,谢谢~~~
评论共2页: 上一页 1 2