老赵点滴


  先做人,再做技术人员,最后做程序员。
  我的理想:“让外国人看中国人写的技术书籍和文章”。Try as I might
posts - 287, comments - 10551, trackbacks - 137, articles - 6
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

  User Control大家肯定不会陌生,在使用ASP.NET的过程中,除了aspx页面,最常见的就莫过于ascx了。ascx是一个有独立逻辑的组件,提供了强大的复用特性,合理使用,能够大大提高开发效率。通过User Control直接生成HTML内容其实已经是一个比较常用的技巧了(尤其在AJAX时代),不过网络上这方面的内容比较少,很多人还是在苦苦地拼接字符串,因此在这里我通过一个实例简单介绍一下这个技巧。

  对一个对象(文章,图片,音乐,etc.)进行评论是应用中最常见的功能之一。首先,我们定义一个Comment类,以及其中会用到的“获取”方法:

public partial class Comment
{
    public DateTime CreateTime { get; set; }
 
    public string Content { get; set; }
}
 
public partial class Comment
{
    private static List<Comment> s_comments = new List<Comment>
    {
        new Comment
        {
            CreateTime = DateTime.Parse("2007-1-1"),
            Content = "今天天气不错"
        },
        new Comment
        {
            CreateTime = DateTime.Parse("2007-1-2"),
            Content = "挺风和日丽的"
        },
        new Comment
        {
            CreateTime = DateTime.Parse("2007-1-3"),
            Content = "我们下午没有课"
        },
        new Comment
        {
            CreateTime = DateTime.Parse("2007-1-1"),
            Content = "这的确挺爽的"
        }
    };
 
    public static List<Comment> GetComments(int pageSize, int pageIndex, out int totalCount)
    {
        totalCount = s_comments.Count;
 
        List<Comment> comments = new List<Comment>(pageSize);
 
        for (int i = pageSize * (pageIndex - 1);
            i < pageSize * pageIndex && i < s_comments.Count; i++)
        {
            comments.Add(s_comments[i]);
        }
 
        return comments;
    }
}

  为了显示一个评论列表,我们可以使用一个用户控件(ItemComments.aspx)来封装。自然,分页也是必不可少的:

<asp:Repeater runat="server" ID="rptComments">
    <ItemTemplate>
        时间:<%# (Container.DataItem as Comment).CreateTime.ToString() %><br />
        内容:<%# (Container.DataItem as Comment).Content %>
   
</ItemTemplate>

    <SeparatorTemplate>
        <hr />
    </SeparatorTemplate>
    <FooterTemplate>
        <hr />
    </FooterTemplate>

</asp:Repeater>
 
<% if (this.PageIndex > 1)
   { %>
        <a href="/ViewItem.aspx?page=<%= this.PageIndex - 1 %>" title="上一页">上一页</a>&nbsp;
<% } %>

<% if (this.PageIndex * this.PageSize < this.TotalCount)
   { %>
        <a href="/ViewItem.aspx?page=<%= this.PageIndex + 1 %>" title="上一页">下一页</a>
<% } %>

public partial class ItemComments : System.Web.UI.UserControl
{
    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
 
        this.rptComments.DataSource = Comment.GetComments(this.PageSize,
            this.PageIndex, out this.m_totalCount);
        this.DataBind();

    }
 
    public int PageIndex { get; set; }
 
    public int PageSize { get; set; }
 
    private int m_totalCount;
    public int TotalCount
    {
        get
        {
            return this.m_totalCount;
        }
    }
} 

  然后再页面(ViewItem.aspx)中使用这个组件:

<div id="comments"><demo:ItemComments ID="itemComments" runat="server" /></div>

public partial class ViewItem : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.itemComments.PageIndex = this.PageIndex;
    }
 
    protected int PageIndex
    {
        get
        {
            int result = 0;
            Int32.TryParse(this.Request.QueryString["page"], out result);
 
            return result > 0 ? result : 1;
        }
    }
} 

  打开ViewItem.aspx之后效果如下:

时间:2007/1/1 0:00:00
内容:今天天气不错
时间:2007/1/2 0:00:00
内容:挺风和日丽的
时间:2007/1/3 0:00:00
内容:我们下午没有课
下一页

  这张页面的功能非常简单,那就是察看评论。当前评论的页码会使用QueryString的page项进行指定,然后在ViewItem.aspx里获取到并且设置ItemComments.ascx控件的属性。ItemComments控件会根据自身属性来获取数据,进行绑定,至于显示内容,全都定义在ascx中了。由于需要分页功能,这个评论控件中还包含了上一页和下一页的链接,他们链接的目标很简单,就是ViewItem.aspx页,并且加上页码的Query String而已。

  功能是完成了,不过用着用着忽然觉得不妥,为什么呢?因为我们在翻页,或者用户发布评论的时候,整张页面都刷新了。这可不好,要知道可能ViewItem页中还有其他几个显示部分,它们可是不变的。而且如果其他几个部分也需要分页,那么可能就需要保留页面上每一部分的当前页码,这样开发的复杂性还是比较高的。

  那么我们不如用AJAX吧。无论是用户察看评论时进行翻页还是发表评论,都不会对页面上的其他内容造成影响。要开发这个功能,自然需要服务器端的支持,那么该怎么做呢?一般我们总是有两种选择:

  1. 服务器端返回JSON数据,在客户端操作DOM进行呈现。
  2. 服务器端直接返回HTML内容,然后在客户端设置容器(例如上面id为comments的div)。

  不过无论采用哪种做法,“呈现”的逻辑一般总是另写一遍(第一次的呈现逻辑写在了ItemComments.ascx中)。如果使用第1种做法,那么呈现逻辑就需要在客户端通过操作DOM进行呈现;如果使用第2种做法,那么就要在服务器端进行字符串拼接。无论哪种做法都违背了DRY原则,当ItemComments.ascx里的呈现方式修改时,另一处也要跟着修改。而且无论是操作DOM元素还是拼接字符串维护起来都比较麻烦,开发效率自然也就不高了。

  如果我们能够直接从ItemComments控件获得HTML内容该多好啊——那么我们就这么做吧。请看如下代码(GetComments.ashx):

public class GetComments : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
 
        ViewManager<ItemComments> viewManager = new ViewManager<ItemComments>();
        ItemComments control = viewManager.LoadViewControl("~/ItemComments.ascx");
 
        control.PageIndex = Int32.Parse(context.Request.QueryString["page"]);
        control.PageSize = 3;
 
        context.Response.Write(viewManager.RenderView(control));
    }
 
    public bool IsReusable { ... }
} 

  很简单的代码,不是吗?创建对象,设置属性,然后通过Response.Write输出而已。实在没什么大不了的——不过关键就在于ViewManager类,我们来看一下它是怎么实现的:

public class ViewManager<T> where T : UserControl
{
    private Page m_pageHolder;
 
    public T LoadViewControl(string path)
    {
        this.m_pageHolder = new Page();
        return (T)this.m_pageHolder.LoadControl(path);
    }
 
    public string RenderView(T control)
    {
        StringWriter output = new StringWriter();
 
        this.m_pageHolder.Controls.Add(control);
        HttpContext.Current.Server.Execute(this.m_pageHolder, output, false);
 
        return output.ToString();
    }
}

  ViewManager中只有两个方法:LoadViewControl和RenderView。LoadViewControl方法的作用是创建一个Control实例并返回,RenderView方法的作用则就是生成HTML了。这个实现方式的技巧在于使用了一个新建的Page对象作为生成控件的“容器”,而最后其实我们是将Page对象的整个生命周期运行一遍,并且将结果输出。由于这个空的Page对象不会产生任何其他代码,因此我们得到的,就是用户控件生成的代码了。

  不过要实现这个AJAX效果,还需要做两件事情。

  第一,就是简单修改一下ItemComments控件中的翻页链接,让它被点击时调用一个JavaScript函数。例如“上一页”的代码就会变成:

<a href="/ViewItem.aspx?page=<%= this.PageIndex - 1 %>" title="上一页"
    onclick="return getComments(<%= this.PageIndex - 1 %>);">上一页</a>

  第二,就是实现getComments这个客户端方法。在这里我使用了prototype框架,好处就是能够用相当简洁的代码来做到替换HTML的AJAX效果:

<script type="text/javascript" language="javascript">
    function getComments(pageIndex)
    {
        new Ajax.Updater(
            "comments",
            "/GetComments.ashx?page=" + pageIndex + "&t=" + new Date(),
            { method: "get" });
       
        return false; // IE only
    }
</script>

  大功告成。

  其实就像之前所说的那样,使用UserControl进行HTML代码生成是一个十分常用的技巧。尤其在AJAX应用越来越普及的情况下,合理使用上面提到的方式可以方便的为我们的应用添加AJAX效果。而且很多情况下,我们即使不需要在页面上显示内容,也可以将内容使用UserControl进行编辑。因为编写UserControl比拼接字符串的方式无论是在开发效率上还是可维护性上都高出许多。由于这个方式其实使用了WebForms这个久经考验的模型,因此在执行效率方面也是相当高的。此外,就刚才的例子来说,使用UserCotrol进行HTML生成还有其他好处:

  1. 页面呈现逻辑只实现了一次,提高了可维护性。
  2. 不会影响页面的SEO,因为在客户端<a />的href还是有效的。

  事实上,WebForms是一个非常强大的模型,所以ASP.NET MVC的View也使用了WebForms的引擎。通过上面这个例子,我们其实还可以做到其他很多东西——例如用UserControl来生成XML数据,因为UserControl本身不会带来任何额外的内容。

评论共2页: 1 2 下一页 

Feedback

#1楼    回复  引用  查看    

2007-12-31 00:11 by 深蓝      
我一般使用自定义服务器控件来做,用户控件只是个控件的集合器。

#2楼    回复  引用  查看    

2007-12-31 00:15 by 阿不      
很早就在用了,是从ScottGu那边抄过来的。

#3楼 [楼主]   回复  引用  查看    

2007-12-31 00:17 by Jeffrey Zhao      
@一个农民
哪来匿名方法。

#4楼 [楼主]   回复  引用  查看    

2007-12-31 00:18 by Jeffrey Zhao      
@深蓝
服务器控件开发效率太低,还不能让美工参与进来。如果只是自己项目用的话,实在没有必要这么做。

#5楼 [楼主]   回复  引用  查看    

2007-12-31 00:18 by Jeffrey Zhao      
@一个农民
单元测试那个做不好。

#6楼 [楼主]   回复  引用  查看    

2007-12-31 00:19 by Jeffrey Zhao      
@阿不
对的对的,有过那么一片文章。

#7楼    回复  引用  查看    

2007-12-31 00:29 by Clingingboy      
呵呵,其实这个做法跟ComponentArt的CallBack控件很相似.
我认为用UserControl可以随时的满足ajax与传统网页的互换,如果你已经在网页中使用了UserControl,同时又想改成ajax加载可以在Render方法中输出控件的字符串.我自己做的blog就是用这种方式.我也比较喜欢:)

可参考此文
http://www.cnblogs.com/Clingingboy/archive/2007/07/10/812688.html

#8楼    回复  引用  查看    

2007-12-31 00:32 by Clingingboy      
说实话的,我们可以采用HTMLControl,因为我发现可以通过适配器改变控件ID和Name的输出方式.
WebControl也是可以的,用HTMLControl更容易与美工结合,ID,后端功能都可以满足

#9楼 [楼主]   回复  引用  查看    

2007-12-31 00:39 by Jeffrey Zhao      
@Clingingboy
你的blog是啥子?

#10楼    回复  引用  查看    

2007-12-31 00:41 by Clingingboy      
不过我没发现HttpServerUtility的Execute方法,所以没写在HttpHandler,学了一招:)

#11楼    回复  引用  查看    

2007-12-31 00:41 by egmkang      
我是一新手.看了半天,想着应该是想把 用户控件 当作一个简化的aspx页面,产生html代码,提供客户端异步刷新页面,对不对?

#12楼    回复  引用  查看    

2007-12-31 00:42 by Clingingboy      
@Jeffrey Zhao
就是自己做着玩的
www.clingingboy.cn

#13楼    回复  引用  查看    

2007-12-31 01:00 by sunlife      
你好,看了你的一些文章,我想请教您一个问题:在做网站时是不是自己尽量不要用服务器控件,如果是这样,那我们怎么用webform中比较重要的control模型来开发一些控件使用呢?如果我们开发一些没有UI的控件,那样我们的效率是不是就不高了.我想问一下,对于开发网站来说,考虑到和美工的结合,我们应该采用什么样的编程方式,才能够更好?

#14楼 [楼主]   回复  引用  查看    

2007-12-31 01:16 by Jeffrey Zhao      
@egmkang
嗯啊,的确可以这样。

#15楼 [楼主]   回复  引用  查看    

2007-12-31 01:17 by Jeffrey Zhao      
@Clingingboy
好像这个AJAX的不利于SEO啊,呵呵。

#16楼 [楼主]   回复  引用  查看    

2007-12-31 01:17 by Jeffrey Zhao      
@sunlife
简单的服务器端控件,比如TextBox,Panel,Button,DropDownList(简单改造后)等等都可以使用。

#17楼    回复  引用  查看    

2007-12-31 03:38 by 怪怪      
支持一下^^

你是言出必行, 我是说话不算话, 从第一次上你博客答应给别人的WebPart Hack到后来很多东西, 一个都没放出来(主要是很多都是随手写的我自己一个人用的版本, 觉得写得太乱, 怕人笑话, 这个心理老克服不了, 可是细心整理的基本没什么缺陷的时间又没有)

所以我觉得大家都应该多谢老赵这样的热心人, 毕竟都要花很多功夫的.

#18楼    回复  引用  查看    

2007-12-31 03:53 by 烟头上的探戈      
学习了!

#19楼    回复  引用    

2007-12-31 09:25 by 小宇gg [未注册用户]
没看太懂...很复杂的说..

最后的if片段有点像asp...

飘...

#20楼    回复  引用  查看    

2007-12-31 09:26 by YanziMyWife      
怎么老赵的BLOG用MAXTHON2进会死掉啊!

#21楼    回复  引用    

2007-12-31 09:59 by 年华 [未注册用户]
好东西 以前也想过这样做,但是不知道用户控件怎样生成html代码,学习了

感谢老赵!!!

#22楼 [楼主]   回复  引用  查看    

2007-12-31 10:05 by Jeffrey Zhao      
@怪怪
我的这些容易写,呵呵。

#23楼 [楼主]   回复  引用  查看    

2007-12-31 10:06 by Jeffrey Zhao      
@YanziMyWife
是吗?有没有具体的症状?

#24楼    回复  引用    

2007-12-31 10:13 by dusonchen [未注册用户]
prototype,jquery,extjs三者,老赵你觉得哪个比较有优势呢?

#25楼    回复  引用    

2007-12-31 10:59 by winken21 [未注册用户]
过年了...
一起床就看到好文章...
哈哈...
最近还正想用呢...

#26楼    回复  引用  查看    

2007-12-31 11:13 by SZW      
extjs太大了,只是效果比酷现成的功能多一点(像ASP.NET AJAX Toolkit那样),jquery属于“轻量级”的,完全自己开发的话我个人还是选择了jquery。不过要说和WebForm结合的好的话,当然还是Extjs,jquery在DOM操作上和WebForm的衔接让人不爽。

老赵,"&t=" + new Date()在你这只是为了区分同一页面的不同URL字段,防止重新载入时不能刷新(就像有的验证码那样),还是有别的用途?

#27楼 [楼主]   回复  引用  查看    

2007-12-31 11:39 by Jeffrey Zhao      
@SZW
AJAX的GET操作可能会在IE下被缓存,用不同URL是为了避免这点。

#28楼    回复  引用  查看    

2007-12-31 11:41 by SZW      
恩,我第一点就是这个意思,我做那些AJAX的验证码也只想到了这个方法,之前一直在寻找更好的办法,不过我用jquery做ajax的时候好像可以直接避免这个问题

补充一点,有时候即使不是ajax的缓存,只是一个img/src之类的,也需要用这个方法去做,因为同样的URL浏览器是不会重新载入的,就像我们使用#name标签那样,不过就不只在AJAX范围内了

#29楼    回复  引用  查看    

2007-12-31 11:44 by Clingingboy      
把标签头 If-Modified-Since设置为0就可以了,我直接手动改了prototype的代码加了一句
Firefox没这个问题

#30楼    回复  引用  查看    

2007-12-31 12:02 by BlackCat      
放假了,但是园子里依然热闹,支持一下

#31楼    回复  引用  查看    

2007-12-31 12:29 by 隐姓埋名      
才学初浅!
似懂非懂!

继续关注!!!

谢谢!!!

#32楼    回复  引用  查看    

2007-12-31 14:00 by 张荣华      
学习中
不过赵老大是不是在ViewItem.Page_Load中忘了赋值PageSize属性呢

#33楼    回复  引用  查看    

2007-12-31 14:11 by stonezhu      
呵呵,赞一个,看来真是孤陋寡闻,老赵真有一套啊,这个方法不错。自己开发方便,又提高了UserControl的利用率,UserControl确实做得不错,生成不加垃圾代码,只是一个DIV,
期待老赵多出经典

祝 元旦快乐

#34楼 [楼主]   回复  引用  查看    

2007-12-31 14:19 by Jeffrey Zhao      
@stonezhu
哪来DIV啊,DIV是我在aspx里加的。
UserControl一点多余代码也没有。

#35楼    回复  引用  查看    

2007-12-31 14:42 by stonezhu      
@Jeffrey Zhao
噢,刚才想到了Panel :)
Panel加了后是一个DIV, UserControl是没有东西的,呵呵
头晕了.2007的最后一次头晕:)

#36楼    回复  引用  查看    

2007-12-31 15:56 by 金色海洋(jyk)      
老大就是老大,这么多人回复。

#37楼    回复  引用    

2007-12-31 16:11 by Awen7501 [未注册用户]
好文!希望园子里面这类型的文章多点,^_^,支持!

#38楼    回复  引用    

2007-12-31 17:39 by 不明白 [未注册用户]
private static List<Comment> s_comments = new List<Comment>
{
new Comment
{
CreateTime = DateTime.Parse("2007-1-1"),
Content = "今天天气不错"
},
......
};
这是什么写法啊。怎么看不懂啊?

#39楼    回复  引用    

2007-12-31 17:46 by 不明白 [未注册用户]
new表达式后面可以是{}??文章不错。就这个地方不明白。

#40楼 [楼主]   回复  引用  查看    

2007-12-31 19:03 by Jeffrey Zhao      
@不明白
C#3.0的object initializer

#41楼    回复  引用  查看    

2007-12-31 21:27 by Melodicsoul      
不错啊,又是另一种思路,有时间我也试下,感谢分享!

#42楼    回复  引用    

2008-01-01 01:08 by HSimon [未注册用户]
感谢分享。
请问一下
public class ViewManager<T> where T
这种语法是什么,能推荐一些相关的资料么?

#43楼 [楼主]   回复  引用  查看    

2008-01-01 01:29 by Jeffrey Zhao      
@HSimon
范型(Generic)。
资料网上或MSDN一搜一大把,有点年份的东西了,需要跟进了,呵呵。:)

#44楼    回复  引用  查看    

2008-01-02 11:36 by 啊东      
多谢分享...

#45楼    回复  引用    

2008-01-02 14:23 by doublog [未注册用户]
这个和飞鸽写的哪个教程差不多 呵呵

我一直用这种方法,但是我不知道这种方法效率如何?
老赵 啥时候评测一下?

#46楼 [楼主]   回复  引用  查看    

2008-01-02 14:33 by Jeffrey Zhao      
@doublog
性能和普通的ASP.NET WebForms一样。

#47楼    回复  引用  查看    

2008-01-02 15:25 by 武眉博<活靶子.Net>      
这个很好!我以前为了考虑SEO 先判断浏览器Agent如果是常见蜘蛛那么分页代码就/xx.pageindex.aspx 如果不是那就ajax的,今天又学习一招。

#48楼    回复  引用    

2008-01-02 16:25 by doublog [未注册用户]
--引用--------------------------------------------------
武眉博&lt;活靶子.Net&gt;: 这个很好!我以前为了考虑SEO 先判断浏览器Agent如果是常见蜘蛛那么分页代码就/xx.pageindex.aspx 如果不是那就ajax的,今天又学习一招。
--------------------------------------------------------
你狠啊 看来为了蜘蛛什么都能想的出来啊

#49楼    回复  引用    

2008-01-02 17:44 by sunny11 [未注册用户]
请问一下,做大型社会网站,用ORM会存在性能问题吗,请问可以用ORM映射吗?

#50楼    回复  引用    

2008-01-02 17:46 by sunny11 [未注册用户]
网站和企业应用,关注点不一样,企业应用可能用,它关注的是业务,同时使用的人数也不会很多,但是大型网站可能访问量就很高,用ORM是不是就不好了

#51楼 [楼主]   回复  引用  查看    

2008-01-02 17:50 by Jeffrey Zhao      
@sunny11
很难造成性能瓶颈。

#52楼 [楼主]   回复  引用  查看    

2008-01-02 17:50 by Jeffrey Zhao      
--引用--------------------------------------------------
doublog: --引用--------------------------------------------------
武眉博&lt;活靶子.Net&gt;: 这个很好!我以前为了考虑SEO 先判断浏览器Agent如果是常见蜘蛛那么分页代码就/xx.pageindex.aspx 如果不是那就ajax的,今天又学习一招。
--------------------------------------------------------
你狠啊 看来为了蜘蛛什么都能想的出来啊
--------------------------------------------------------
会不会被搜索引擎判作弊?

#53楼    回复  引用    

2008-01-02 18:34 by sunny11 [未注册用户]
很难造成性能瓶颈??

#54楼    回复  引用    

2008-01-02 18:41 by sunny11 [未注册用户]
用ORM效率是不高的

#55楼 [楼主]   回复  引用  查看    

2008-01-02 20:39 by Jeffrey Zhao      
@sunny11
相对于许多东西都自己写,自然效率比较低,但是一个系统的性能问题不太会是ORM造成的。性能自有瓶颈,而这个瓶颈不太会是ORM。

#56楼    回复  引用  查看    

2008-01-02 20:45 by 武眉博<活靶子.Net>      
--引用--------------------------------------------------
Jeffrey Zhao: --引用--------------------------------------------------
doublog: --引用--------------------------------------------------
武眉博&lt;活靶子.Net&gt;: 这个很好!我以前为了考虑SEO 先判断浏览器Agent如果是常见蜘蛛那么分页代码就/xx.pageindex.aspx 如果不是那就ajax的,今天又学习一招。
--------------------------------------------------------
你狠啊 看来为了蜘蛛什么都能想的出来啊
--------------------------------------------------------
会不会被搜索引擎判作弊?
--------------------------------------------------------
根据到目前的观察 并没有 而且我认为这个也不构成作弊 就像我用了ajax又要兼顾SEO在sitemap.aspx中给实际链接一样的

#57楼 [楼主]   回复  引用  查看    

2008-01-02 20:54 by Jeffrey Zhao      
@武眉博<活靶子.Net>
其实不一样的。理论上如果特意为搜索引擎“制作”和普通用户访问不同的页面,是会被认作作弊的。不过其实你这个应该还好,因为修改的地方不多。呵呵。

#58楼    回复  引用  查看    

2008-01-02 22:23 by 小鹿      
new Ajax.Updater(
"comments",
"/GetComments.ashx?page=" + pageIndex + "&t=" + new Date(),
{ method: "get" });
Ajax.Updater是prototype里面的吗 不怎么明白

#59楼    回复  引用  查看    

2008-01-03 09:49 by 1-2-3      
非常实用。收藏。

#60楼 [楼主]   回复  引用  查看    

2008-01-03 11:25 by Jeffrey Zhao      
@小鹿
Ajax.Updater方法是prototype里的。

#61楼    回复  引用    

2008-01-03 16:51 by HSimon [未注册用户]
@Jeffrey Zhao
谢谢!
<T>这个知道,主要是后面那个“where T” 不是很理解。还希望说说
:)

#62楼 [楼主]   回复  引用  查看    

2008-01-03 19:23 by Jeffrey Zhao      
--引用--------------------------------------------------
HSimon: @Jeffrey Zhao
谢谢!
<T>这个知道,主要是后面那个“where T” 不是很理解。还希望说说
:)
--------------------------------------------------------
泛型约束,具体查文档吧

#63楼    回复  引用    

2008-01-04 10:34 by HSimon [未注册用户]
@Jeffrey Zhao
Thanks,:)

#64楼    回复  引用  查看    

2008-01-04 15:31 by 马可香蕉      
HttpContext.Current.Server.Execute(this.m_pageHolder, output, false);

方法第一个参数应该是IHttpHandler类型的,为什么Page类型也可以,Page继承IHttpHandler吗?

#65楼    回复  引用  查看    

2008-01-04 17:16 by SZW      
@sunny11
--引用--------------------------------------------------
sunny11: 用ORM效率是不高的
--------------------------------------------------------
我在用.net3.5时候也一直也在考虑这个问题,不