Hello World
Spiga

为WebForms说几句话,以及一些ASP.NET开发上的经验(2)

2007-12-22 22:41 by 老赵, 11730 visits

没想到我的文章引起了那么大的反应,看来最近MVC框架的确是一个热门话题。正如上一篇文章开始所说的,我不会对MVC框架有任何“贬低”,任何技术滥用都有问题,所以任何东西都会有所谓的Best Practice(去MSDN的Patterns & Practice栏目看看就知道了)。我写这几篇文章,是想说明,很多WebForms的缺点是被夸大了。WebForms的确有缺点,但是我们完全可以避开,并且仅仅利用到WebForms给我们带来的便利。这其实也是一种Best Practice。相信以后MVC框架也一定会出现这样的东西。

在上一篇的评论中,有朋友说我是“边缘”的ASP.NET程序员,大概是因为我用WebForms但是抛弃ViewState、PostBack和GridView这种“重要”的东西吧。我不知道这样是不是“边缘”,但是我的确抛弃了不少东西。例如还有ADO.NET中的DataSet/DataTable——但是我们还有DataReader呢!抛弃了微软提供的一部分东西,我们其实可以发现,.NET里的基础组件一个都不少,用起来也会得心应手。

去其糟粕,取其精华。

三、生成丑陋的HTML,难以进行样式控制

在ASP.NET的WebForms刚出现时,各种“演示”看上去真的很美。这个特点微软至今还保留着,各微软技术大会上的演示真的让人感到心潮澎湃。在我看来,那些“激素大会”更是一种推广策略,而并没有将目光集中在技术细节的本身。所以微软的东西似乎总是有入门容易提高难的“毛病”。开发人员被“宠坏”了,上一篇文章中有位朋友说这就是“穷人的孩子早当家”,还是有一定道理的。在.NET环境下我们就像是官宦子弟,不过这并不能成为我们习惯于“吃喝嫖赌”的理由。我们要合理利用富裕的环境带给我们的资源,但是要适当地抛弃一些不好的东西。

好像说了几句废话,现在进入正题。说到WebForms则不得不提丰富的控件,基于ASP.NET平台的第三方控件提供商似乎比其他平台下的总合还要多,这也是产业阿。在微软提供的控件里,GridView(或者1.1里的DataGrid)是被“演示”次数最多的,也似乎是最强大(还是差不多等同于“复杂”)的。有了GridView之后,很多开发人员就习惯于朝页面上拖个控件,然后再设计器里点点鼠标,设设样式,最后绑定一个DataTable上去。哗,好一个表格就此诞生。然后我们还可以响应其事件,对某一行数据进行编辑,删除。太轻松了,这世界一下子变得美好了起来。不过由于GridView过于“强大”,它几乎成为了ASP.NET初学人员的必修课,当对于Web开发都不明就里的初学者都习惯于GridView、GridView、GridView时,它的滥用也就不可避免了。于是乎,做表格,用GirdView,做列表,也用GirdView(不就是个只有一列的表格嘛)。

可惜的是,GridView有很多毛病。如果要使用GridView的高级功能(添加、修改、删除等等),ViewState必不可少,再加上很多开发人员在绑定数据时没有经过筛选,导致ViewState变得无比庞大(例如显示一个文章列表,明明只需要ID、标题,创建时间等基本信息,却用一个“令人无比愉悦”的SELECT * FROM Article语句把文章内容也选择了出来并绑定在GridView上,ViewState中也就不得不包含几千几万字的多余数据)。

不过现在想说的,倒是它生成出的HTML。

GridView在客户端生成的HTML是个<table />,可惜这个<table />里东西太多了,的确显得很丑陋。不过更关键的在于,这个表格的样式实在难以控制。虽说GridView里从标题到单元格到低部都能够进行样式的定义,但是灵活度还是远远不够。再加上GridView生成的HTML死板而不符合Web标准(例如不会生成<th />标签,用ControlAdaptor进行改造的做法不算),但是优秀的样式开发人员大都是坚定的Web标准支持或推广者,ASP.NET对于标准支持不佳,难以控制样式的说法满天飞扬。

我想为WebForms喊冤。不过首先我会打倒以GridView为首的复杂控件(包扩DataList、FormView等等)并狠狠踩上几脚。有人说,当抛弃了GridView之后,用WebForms还有什么意义?其实类似的话也不断在我说要抛弃ViewState和(复杂)的PostBack时出现。如果您觉得抛弃了这些东西WebForms就失去意义的话,那么我想说,ViewState、PostBack、GridView远不是WebForms的全部。我认为,Control模型(或者说组件化模型)才是WebForms的关键。而这个模型的“基础”是绝对优秀的。下面我会进行一些展示,虽然这些展示我觉得是基础中的基础。

首先我们先来看一下最常用的用户控件的表现吧(DemoControl.ascx):

<%@ Control Language="C#" AutoEventWireup="true" %>

<%= "Hello World!" %>

然后将它放在页面里:

<div> 
    <uc1:DemoControl ID="DemoControl1" runat="server" />
</
div>

在浏览器里打开页面会发现如下的代码:

<div> 
    Hello World!
</
div>

多干净的代码,我甚至连多余的空格都没有去除。还有一个例子就是Master Page,<asp:ContentPlaceHolder />也不会产生任何多余的代码。这说明了使用用户控件搭出的WebForms页面,是不会出现多余的“脏”代码的。如果您在观察那些基础控件,TextBox,CheckBox(不设Text属性),Panel等等,亦或是加上runat=server的HTML元素,无一例外(当然客户端ID的确还是比较长,关于这个问题我会在以后的文章进行讨论)。

那么肮脏的Tag是哪里来的呢?当然是以GridView为首的复杂控件。那么如果我们要生成批量数据,又该怎么办呢?现在来看看Repeater的表现吧,就以最常见的无序列表为例:

<asp:Repeater runat="server" ID="rptItems">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li>
            <img src="<%# Eval("ImagePath")) %>" alt="<%# Eval("Title") %>" />
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

还是在浏览器里察看HTML(我这里就不贴出来了),一行多余的代码也没有。

Repeater是ASP.NET 2.0中我最喜欢用的控件,它的功能很简单,把ItemTemplate和AlternatingItemTemplate的内容返回生成在页面上,并且将HeaderTemplate和FooterTemplate的内容显示在头尾。除此之外——没了。但是这已经足够了,对于绑定控件来说,还需要什么呢?这里面每一行代码都由我们自己编写,想定义样式也易如反掌,我们对于HTML的控制没有任何损失。

另外,有些开发人员总认为ASP.NET中的DataTable绑定的方式让我们无法写出建模良好的代码。就算使用ObjectDataSource,在控制上也会有诸多不便。但这个也是一种误解,我们完全可以将领域模型中的对象绑定到视图里的控件上。首先是ASPX的内容:

<asp:Repeater runat="server" ID="rptItems">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li>
            <img src="<%# this.GetImagePath(Container.DataItem) %>"
                alt="<%# Eval("Title") %>" />

        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

然后是Code Behind:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.rptArticles.DataSource = this.GetArticles();
        this.rptArticles.DataBind();
    }

    protected string GetImageUrl(object dataItem)
    {
        return "http://img.jeffz.net/" + (dataItem as Article).ImagePath;
    }
}

GetArticles方法的返回值可以是List<Article>或任何一个实现了IEnumerable<Article>接口的类型,这个样在ItemTemplate中访问Container.DataItem就会得到这个Article对象。我们在Code Behind类里定义一个protected方法,由于aspx最终会被编译为Code Behind类的子类,因此我们就可以在ASPX页面中调用GetImageUrl方法。在方法内部我们可以将object类型的DataItem转换成Article类型的对象,然后就可以做任意的处理了。

非常方便,非常灵活,还有什么可挑剔的呢?。

有。比如我们想要使用每行10个元素,最后一行如果不足就让右边空着的方式来展示,Repeater可能就难以实现了(其实不能这么说,按标准应该还是使用无序列表,用样式来进行控制,Repeater完全够用)。ASP.NET 1.1和2.0可能我们会使用DataList控件,只要把RepeaterColumns属性设为10即可。可惜DataList生成的元素要么是<table />,要么是<span />和<br />,让人头疼。但是在ASP.NET 3.5中又多了一个ListView控件,使用这个控件进行展示可以分组循环,可以指定容器,真可谓无比强大。重要的是ListView和Repeater一样,所有的HTML都由自己控制,一个多余的字符都没有。

有了Repeater和ListView,真可谓打遍天下无敌手,任何页面的展示方式都不在话下。

我们再走个极端吧,我们来看下面的呈现方式:

<ul> <% foreach (Article article in this.GetArticles())
   { %>
        <li>
            <img src="<%= "http://img.jeffz.net/" + article.ImagePath %>"
                alt="<%= article.Title %>" />
        </li>
<% } %>
</ul>

上面的例子在ASPX页面中使用了内联的foreach语句进行显示。这样生成代码无论从干净还是自定义角度来说,都可以的让任何开发方式“无地自容”。但关键是,这个方式……为什么……恩,没错,说的难听,这是原始的ASP的开发方式;说的好听,这是“先进”ASP.NET MVC框架中模板的写法。这是不是很讽刺?但是这个的确是事实。Rick Strahl大牛也在他的Blog中写到:“我还记得在早些时候,那些ASP.NET的疯狂追随者们是多么不屑使用内联的脚本标签,或者使用显式的URL而不是PostBack来进行开发的做法,而其中的一些人现在又毫不犹豫地张开双臂去迎接MVC框架,这难道不讽刺吗?”而且由于ASP.NET MVC的特性(从Controller传递到View的只是一个ViewData对象),因此真正ASP.NET MVC的“模板”的写法还要多一次Cast,也就是类似于如下的写法(当然ASP.NET MVC可以使用强类型的ViewData,这样就免去了这样强行的Cast):

<ul> <% foreach (Article article in (ViewData["Articles"] as List<Article>))
   { %>
        <li>
            <img src="<%= "http://img.jeffz.net/" + article.ImagePath %>"
                alt="<%= article.Title %>" />
        </li>
<% } %>
</ul>

这里就要谈到ASP.NET MVC了。其实光从View上来看,我不知道这算不算是进步(当然其实我不介意内联的写法,有时候反而更清晰)。ASP.NET MVC如果光从View(模板)方式来看,有点回到了当年的ASP方式(当然,还是补充了一些Helper)。ASP.NET MVC的特点在于M-V-C的分离,在于业务逻辑的触发方式,在于URL Routing的驱动方式,而不是模板化的写法。如果要说MVC在View层面比ASP.NET清晰,我是肯定不会同意的,因为我完全可以在WebForms的ASPX页面中“写成”ASP.NET MVC类似的方式。不知道您是否同意,至少我认为,使用WebForms内Repeater或ListView的写法,不会输给ASP.NET MVC的模板。而且事实上,在ASP.NET MVC中作为View使用的aspx页面里,我们完全也可以放置Repeater,然后再Page_Load方法里写代码,这更证明了,在View方面WebForms和ASP.NET MVC其实是非常相似的。

刚才说了,ASP.NET MVC的重要特点,在于M-V-C之间的分离,非常清晰,而且Model和Controller之间能够进行独立的测试。但是WebForms也可以做到这一点,我在后面的文章中还会谈一下WebForms里如何使用MVC来做到清晰、分离和单元测试等等。而且,我似乎觉得某些WebForms中能够做到的东西在MVC框架里却无法或者很难实现。可能是我对于MVC的了解程度还不够多的缘故吧,等我先研究了MVC框架之后再说。:)

讲到这里,您心中是否有了答案,WebForms究竟能否写出清晰美观的HTML?在WebForms控制样式是否困难?抛弃GridView,我们并没有什么损失,因为现在的网页中又有多少会用到GridView的功能呢?

目前老赵在公司使用WebForms开发时会与一个专职的前台开发人员配合。他是我认识的最好的前台开发人员,编程能力强,经验丰富,对于各种浏览器中脚本和样式的差异和问题可谓了如指掌,只是在这之前他只用过PHP,并没有接触过ASP.NET WebForms。但是仅仅向他解释了几个控件生成HTML的方式,或者如何从服务器端获得ClientID之后,我们之间的配合就非常轻松顺畅了。无论是开发人员先写放控件然后由他进行修饰,还是他先写静态样式页面我们再进行替换,都工作的非常顺利。我现在已经能够专注于业务的实现,架构的设计,而彻底从页面样式的“泥潭”中解放了出来,最多编写一下简单的JavaScript代码。分工的明确,也使得我们的工作效率得到了相当的提高。

所以最后我给大家的建议就是,尽可能地使用“纯粹”的服务器端控件。例如使用Repeater和ListView,其实写出优秀的页面非常容易。当然,即使这么做,还是会有一些缺点的,例如:

  1. 例如Repeater的ItemCommand事件已经无法使用了,因为它会用到ViewState。但是我们开发的大部分的页面甚至连PostBack都不需要,这又有什么关系呢?
  2. 使用服务器端控件虽然能让我们对于HTML有十足的控制,但是我们无法避免在客户端生成一个不规则的ID。这一点理论上可能会影响页面样式的开发,但是就我那前台开发人员同事的话来说,除了一些在客户端进行布局的DOM元素之外,几乎不会使用ID来控制样式。就我们工作的结果来看,不规则的ID也并没有造成任何的影响。

 

相关文章:

为WebForms说几句话,以及一些ASP.NET开发上的经验(1):ViewState、性能

为WebForms说几句话,以及一些ASP.NET开发上的经验(3):生成复杂的ID难以使用JavaScript操作

未完待续:

五、MVC

六、单元测试

所属话题:WebForms与MVC
Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

151 条回复

  1. 老赵
    admin
    链接

    老赵 2007-12-22 22:48:00

    从五点断断续续写到现在,写这样的文章真是费神……

  2. wit
    *.*.*.*
    链接

    wit 2007-12-22 22:48:00

    沙发,大哥有文采哈!

  3. wit
    *.*.*.*
    链接

    wit 2007-12-22 22:49:00

    辛苦了,你的文章咱都看,看着惬意!

  4. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 22:51:00

    那么我想说,ViewState、PostBack、GridView远不是WebForms的全部
    =================================
    要命了,我也是这么想的,为什么大家就一看到MVC和WebForms就以为我一定要反对WebForm呢

    补充一下,我说ViewState、PostBack和客户端有关情况,似乎也没说WebForm别的什么了,哈

  5. 老赵
    admin
    链接

    老赵 2007-12-22 22:56:00

    @SZW
    我没说你反对阿,只是在有些问题上有点分歧,呵呵。:)

  6. birdshome
    *.*.*.*
    链接

    birdshome 2007-12-22 22:56:00

    目前WebForm在前端开发中一个比较郁闷的问题就是ID污染,WebForm框架中为了避免命名冲突,使用container Id嵌套拼接的方式从根本上杜绝了冲突,但也使得id在客户端引用变得非常困难。虽然我们知道Page类上提供了获取Client Id的属性,但是这样一来的问题就是JavaScript代码必须和C#耦合在一起,使得前端脚本代码的内聚性几乎消失掉了:(

  7. Anders Cui
    *.*.*.*
    链接

    Anders Cui 2007-12-22 22:57:00

    不错,从文中也可看到不少人对WebForms反感,其实是基于一些误解。博客园社区也是使用WebForms的一个好例子吧,期待老赵的下一篇!

  8. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 22:57:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: @SZW
    我没说你反对阿,只是在有些问题上有点分歧,呵呵。:)
    --------------------------------------------------------
    我已经明白你的意思了,其实很多地方我们是有共识的,关键是我们的一番对话引发了好多人“跟潮”了,我也很郁闷

  9. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:00:00

    @birdshome
    --引用--------------------------------------------------
    birdshome: 目前WebForm在前端开发中一个比较郁闷的问题就是ID污染,WebForm框架中为了避免命名冲突,使用container Id嵌套拼接的方式从根本上杜绝了冲突,但也使得id在客户端引用变得非常困难。虽然我们知道Page类上提供了获取Client Id的属性,但是这样一来的问题就是JavaScript代码必须和C#耦合在一起,使得前端脚本代码的内聚性几乎消失掉了:(
    --------------------------------------------------------
    对于你说的ID污染问题,有时候我已经用CSS替代,毕竟Css返回是不会变的(我通常和jQuery一起用,所以和ID几乎没有区别,甚至可以多个对象一起控制)

    @Jeffrey Zhao
    GridView的客户端代码有时候确实比较烦人,以前迫不得已做了这个插件:希望给点建议:http://www.cnblogs.com/szw/archive/2007/12/17/1002975.html

    希望以后这样繁琐的事情可以少发生一点

  10. 老赵
    admin
    链接

    老赵 2007-12-22 23:02:00

    --引用--------------------------------------------------
    SZW:
    我已经明白你的意思了,其实很多地方我们是有共识的,关键是我们的一番对话引发了好多人“跟潮”了,我也很郁闷
    --------------------------------------------------------
    还是不错的啊,希望能让更多有思考,呵呵。

  11. 老赵
    admin
    链接

    老赵 2007-12-22 23:02:00

    --引用--------------------------------------------------
    birdshome: 目前WebForm在前端开发中一个比较郁闷的问题就是ID污染,WebForm框架中为了避免命名冲突,使用container Id嵌套拼接的方式从根本上杜绝了冲突,但也使得id在客户端引用变得非常困难。虽然我们知道Page类上提供了获取Client Id的属性,但是这样一来的问题就是JavaScript代码必须和C#耦合在一起,使得前端脚本代码的内聚性几乎消失掉了:(
    --------------------------------------------------------
    我觉得不规则的ID反而让前端脚本代码不得不做到内聚……下一片我就会讲到这点,我觉得并没有太大问题啊,呵呵……

  12. 老赵
    admin
    链接

    老赵 2007-12-22 23:03:00

    --引用--------------------------------------------------
    SZW:
    @Jeffrey Zhao
    GridView的客户端代码有时候确实比较烦人,以前迫不得已做了这个插件:希望给点建议:http://www.cnblogs.com/szw/archive/2007/12/17/1002975.html

    希望以后这样繁琐的事情可以少发生一点
    --------------------------------------------------------
    所以我从来不用GridView,真的是一点不用。

  13. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:06:00

    @Jeffrey Zhao
    我也在恢复里说了这样的争论还是有它的价值的,至少还能感受到.NET亲友团的强大。

    只是讨论的主题似乎偏离我的初衷了,哈哈

  14. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:07:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    所以我从来不用GridView,真的是一点不用。
    --------------------------------------------------------
    可能这也是我们在应用环境上产生的差异,有时候,大量的报表(Table格式),让我不得不去使用GridView,要是以前的ASP那我也死心了

  15. 阿不
    *.*.*.*
    链接

    阿不 2007-12-22 23:10:00

    如果只是在展示方面,GridView真的是一点意义都没有。
    另外,我们这边是否还可以再说一下DataSourceControl
    利用DataSourceControl可以减少我们太多的麻烦了。
    我认为使用DataSourceControl就是一种Best Practice。不仅是已有的ObjectDataSource,还包括我们可以自己写的。

  16. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:10:00

    @Jeffrey Zhao
    顺便向老赵讨论个问题,如果if{}else{}判断比较繁琐的话,值不值得用try{}catch{}来(if里面可以报错)?很久前就想找人讨论一下,今天突然又碰到了才想起来

    补充说明一下:if里面也不是相当繁琐,用了if就可以避免报错,老赵有碰到过吗?

  17. 老赵
    admin
    链接

    老赵 2007-12-22 23:11:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    可能这也是我们在应用环境上产生的差异,有时候,大量的报表(Table格式),让我不得不去使用GridView,要是以前的ASP那我也死心了
    --------------------------------------------------------
    其实如果不用直接修改的话,也完全可以用Repeater或ListView来替代。
    不过像你说的大都是报表的应用,对样式的要求可能不会太高吧。我是做互联网应用的,对界面的要求是非常高的,但是没有太多表格数据。

  18. 阿不
    *.*.*.*
    链接

    阿不 2007-12-22 23:12:00

    @SZW
    我个人认为不值得,我们大多数人情况宁愿多一些判断来减少异常出现的可能。

  19. 老赵
    admin
    链接

    老赵 2007-12-22 23:13:00

    @SZW
    一般不要用try...catch...来控制逻辑,因为会大大降低性能——不过应该也不会成为性能瓶颈。
    我还是建议不建议用try...catch来控制逻辑,因为if的话清楚吧,每个条件都是明确的,用try...catch别人还要去看到底什么情况下会抛出异常……

  20. 老赵
    admin
    链接

    老赵 2007-12-22 23:14:00

    --引用--------------------------------------------------
    阿不: @SZW
    我个人认为不值得,我们大多数人情况宁愿多一些判断来减少异常出现的可能。
    --------------------------------------------------------
    还有一点就是,用if...else能够隐藏将会抛出的异常细节。这也是在catch里处理后再抛出的原因,呵呵。

  21. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-22 23:15:00

    "四、生成的ID难以使用JavaScript操作"
    这个到是的,不过只要好好了解一下ASP.NET ID的生成规则,还是可以用Javascript去很好的控制的。如usercontrol前面他会加上usercontrol的ID加_再加你usercontrol的id。
    还有我觉得在用asp.net 的时候,在aspx里面直接调用cs里面的function还是非常方便的。

  22. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:16:00

    @阿不
    恩,我举个我实际碰到的例子:当用if/else可以避免异常,如果不用if,如果数据库返回值是null就会产生异常。

    这时候,我用if控制的话,只就流程上来说,会比较低效。
    如果用try,可以减少很多判断,让他在null的时候,执行我if里面的。

    注:这种方法很多时候if对应catch,else对应try内的内容

  23. 老赵
    admin
    链接

    老赵 2007-12-22 23:16:00

    --引用--------------------------------------------------
    阿不: 如果只是在展示方面,GridView真的是一点意义都没有。
    另外,我们这边是否还可以再说一下DataSourceControl
    利用DataSourceControl可以减少我们太多的麻烦了。
    我认为使用DataSourceControl就是一种Best Practice。不仅是已有的ObjectDataSource,还包括我们可以自己写的。
    --------------------------------------------------------
    我不用DataSourceControl的,因为开发复杂,而且感觉难以应对复杂的业务逻辑,就像ObjectDataSource就比较死板,应用不多……不知道是我没有不了解得结果。

  24. 老赵
    admin
    链接

    老赵 2007-12-22 23:17:00

    --引用--------------------------------------------------
    stonezhu: "四、生成的ID难以使用JavaScript操作"
    这个到是的,不过只要好好了解一下ASP.NET ID的生成规则,还是可以用Javascript去很好的控制的。如usercontrol前面他会加上usercontrol的ID加_再加你usercontrol的id。
    还有我觉得在用asp.net 的时候,在aspx里面直接调用cs里面的function还是非常方便的。
    --------------------------------------------------------
    那太麻烦了,也不是我下面要写的内容的本意啊,呵呵。而且一个好的控件,应该不用知道自己的父控件是什么的,这样才有被广泛使用的意义。

  25. 老赵
    admin
    链接

    老赵 2007-12-22 23:18:00

    --引用--------------------------------------------------
    SZW: @阿不
    恩,我举个我实际碰到的例子:当用if/else可以避免异常,如果不用if,如果数据库返回值是null就会产生异常。

    这时候,我用if控制的话,只就流程上来说,会比较低效。
    如果用try,可以减少很多判断,让他在null的时候,执行我if里面的。

    注:这种方法很多时候if对应catch,else对应try内的内容
    --------------------------------------------------------
    如果从性能上讲的话,一次catch的性能损失可以抵得了无数次if了(条件太复杂的condition不算,呵呵)……

  26. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:19:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    其实如果不用直接修改的话,也完全可以用Repeater或ListView来替代。
    不过像你说的大都是报表的应用,对样式的要求可能不会太高吧。我是做互联网应用的,对界面的要求是非常高的,但是没有太多表格数据。
    --------------------------------------------------------

    我说的报表除了“财务报表”那种直接用来看的,还会涉及到一些操作,一些ItemCommand等等,这些是必须要产生ViewState的,所以我对这个简直是……(还是不要说出来了)

  27. Nathan 暴
    *.*.*.*
    链接

    Nathan 暴 2007-12-22 23:22:00

    写的真好,我也是觉得Gridview太过复杂了,多数情况都用Repeater。还有老赵认为,数据库的交互是影响网站性能的主要因素之一,深表赞同。

  28. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:22:00

    @Jeffrey Zhao
    恩,我明白了,谢谢!只是有时候一个页面我要通过SQL+XML同时控制若干个(客户决定)自动生成的控件(他们的所有属性我也都要完全控制),对应的判断可能会非常多,而且很多是客户端过滤不掉的,所以往往是if里面本来就很复杂了,里面还要套if,那些情况switch还用不上

  29. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-22 23:23:00

    by the way,
    老赵下次可否好好聊一下关于缓存?觉得你写文章非常透彻,错了,应该是你理解的很透彻,所以才能写的透彻。
    我一直对缓存不是很理解,如缓存的过期规则,怎么才能灵活控制,灵活控制数据库里面的数据更新了,缓存更新。(SQL 可以支持,但是其它的可否支持,可以不通过SQL的支持来实现缓存的更新控制,这我很长时间没有搞明白),还是就是文本控制,通过文体的改变通知缓存来更新,但是存数据库的怎么来结合这样的做法。我也搞的糊里糊涂的......
    SOS 老赵.

  30. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:25:00

    缓存确实也是.NET3.5值得关注的一个方面,支持stonezhu ^_^

  31. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-22 23:25:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    stonezhu: "四、生成的ID难以使用JavaScript操作"
    这个到是的,不过只要好好了解一下ASP.NET ID的生成规则,还是可以用Javascript去很好的控制的。如usercontrol前面他会加上usercontrol的ID加_再加你usercontrol的id。
    还有我觉得在用asp.net 的时候,在aspx里面直接调用cs里面的function还是非常方便的。
    --------------------------------------------------------
    那太麻烦了,也不是我下面要写的内容的本意啊,呵呵。而且一个好的控件,应该不用知道自己的父控件是什么的,这样才有被广泛使用的意义。
    --------------------------------------------------------
    如果不是,可以做的更为通过,那是非常期待老赵下一篇的精彩文章啦.

  32. 老赵
    admin
    链接

    老赵 2007-12-22 23:26:00

    --引用--------------------------------------------------
    SZW:
    @Jeffrey Zhao
    我说的报表除了“财务报表”那种直接用来看的,还会涉及到一些操作,一些ItemCommand等等,这些是必须要产生ViewState的,所以我对这个简直是……(还是不要说出来了)
    --------------------------------------------------------
    那么用MVC对这点有帮助吗?

  33. aspnetx
    *.*.*.*
    链接

    aspnetx 2007-12-22 23:28:00

    对于做BI的应用系统来说,webform还是可以让我吃尽甜头的
    我想关键还是看行业应用吧,真正的企业级业务系统恐怕真的很难容忍webform,就目前的情况来看.
    另外,asp.net的版本也已经过三了,是否会和当年asp一样的套路呢,MVC的出现是否说明了什么?
    难道以后所谓的webform与MVC并存难道就是现在微软所宣称的asp.net与asp并存吗?关键还是看看待问题的角度了,从商业角度这么说没什么问题,但是从技术角度从技术人员群体来说恐怕就很难达成一致了.

  34. 一见你就笑[未注册用户]
    *.*.*.*
    链接

    一见你就笑[未注册用户] 2007-12-22 23:30:00

    你说你抛弃了DATASET跟DATATABLE..那要怎么做呢..
    谢谢(:

  35. 老赵
    admin
    链接

    老赵 2007-12-22 23:30:00

    --引用--------------------------------------------------
    stonezhu: by the way,
    老赵下次可否好好聊一下关于缓存?觉得你写文章非常透彻,错了,应该是你理解的很透彻,所以才能写的透彻。
    我一直对缓存不是很理解,如缓存的过期规则,怎么才能灵活控制,灵活控制数据库里面的数据更新了,缓存更新。(SQL 可以支持,但是其它的可否支持,可以不通过SQL的支持来实现缓存的更新控制,这我很长时间没有搞明白),还是就是文本控制,通过文体的改变通知缓存来更新,但是存数据库的怎么来结合这样的做法。我也搞的糊里糊涂的......
    SOS 老赵.
    --------------------------------------------------------
    我在目前的项目里使用了一种基于事件的过期机制。其实这点是比较常见的模式吧,有机会我写一下。
    还有我不懂如何进行“文本(文体?)控制”,我没有听说过这个唉。

  36. 老赵
    admin
    链接

    老赵 2007-12-22 23:31:00

    --引用--------------------------------------------------
    SZW: 缓存确实也是.NET3.5值得关注的一个方面,支持stonezhu ^_^
    --------------------------------------------------------
    .NET 3.5对于缓存有什么新的功能吗?

  37. 老赵
    admin
    链接

    老赵 2007-12-22 23:32:00

    --引用--------------------------------------------------
    stonezhu:如果不是,可以做的更为通过,那是非常期待老赵下一篇的精彩文章啦.
    --------------------------------------------------------
    客气,有了经验之后写这些内容只是简单的“倒出来”而已。:)

  38. 老赵
    admin
    链接

    老赵 2007-12-22 23:33:00

    --引用--------------------------------------------------
    aspnetx: 对于做BI的应用系统来说,webform还是可以让我吃尽甜头的
    我想关键还是看行业应用吧,真正的企业级业务系统恐怕真的很难容忍webform,就目前的情况来看.
    另外,asp.net的版本也已经过三了,是否会和当年asp一样的套路呢,MVC的出现是否说明了什么?
    难道以后所谓的webform与MVC并存难道就是现在微软所宣称的asp.net与asp并存吗?关键还是看看待问题的角度了,从商业角度这么说没什么问题,但是从技术角度从技术人员群体来说恐怕就很难达成一致了.
    --------------------------------------------------------
    我一直搞不懂,为什么企业级业务系统很难容忍webform呢?它们的特点究竟是什么呢?

  39. 老赵
    admin
    链接

    老赵 2007-12-22 23:34:00

    --引用--------------------------------------------------
    一见你就笑: 你说你抛弃了DATASET跟DATATABLE..那要怎么做呢..
    谢谢(:
    --------------------------------------------------------
    我一般只用DataReader,表现层只绑定Domain Model,文章里也写过了。

  40. 伍迷
    *.*.*.*
    链接

    伍迷 2007-12-22 23:34:00

    目前最缺的就是这样极具有经验总结后的应用文章,感谢老赵的分享。

  41. jt[未注册用户]
    *.*.*.*
    链接

    jt[未注册用户] 2007-12-22 23:34:00

    好文,非常看好你的做法,尤其是和领域对象结合的地方

    不过有个问题,每次load的时候都要bind把?和gridview禁用viewstate也一样吧

  42. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-22 23:35:00

    @Jeffrey Zhao
    啊,哈哈,“文本(文体?)控制”,不好意思,就是根据文件的修改时间来控制,不好意思,手快了不知道在写什么了。
    非常谢谢你谈谈缓存控制啊。
    就是不知道是什么时候哦,我想大家也是非常想看看老赵聊缓存哦:-D

  43. 老赵
    admin
    链接

    老赵 2007-12-22 23:35:00

    --引用--------------------------------------------------
    jt: 好文,非常看好你的做法,尤其是和领域对象结合的地方

    不过有个问题,每次load的时候都要bind把?和gridview禁用viewstate也一样吧
    --------------------------------------------------------
    如果要使用GridView的复杂事件,那么要么开启ViewState,要么在Page_Load里再绑定一把。

  44. 老赵
    admin
    链接

    老赵 2007-12-22 23:39:00

    --引用--------------------------------------------------
    stonezhu: @Jeffrey Zhao
    啊,哈哈,“文本(文体?)控制”,不好意思,就是根据文件的修改时间来控制,不好意思,手快了不知道在写什么了。
    非常谢谢你谈谈缓存控制啊。
    就是不知道是什么时候哦,我想大家也是非常想看看老赵聊缓存哦:-D
    --------------------------------------------------------
    哦,原来是这个啊……其实这点还是比较容易相通的吧,就是在该过期的时候修改某个文本文件,然后其它线程就可以通过判断修改时间来知道是否会过期了。
    最近比较忙,我也很久没有写了,今天比较空就写得多了点,明天还要处理工作上的事情呢。创业的时候,每一天都能是休息天,但每天也都可能是工作日……

  45. jt[未注册用户]
    *.*.*.*
    链接

    jt[未注册用户] 2007-12-22 23:39:00

    我想你是想结合ddd和webform,做法挺好,我要借鉴.

    交流的确有帮助,我对webform有所改观,谢谢你 老赵,呵呵

  46. jt[未注册用户]
    *.*.*.*
    链接

    jt[未注册用户] 2007-12-22 23:41:00

    this.GetImagePath(Container.DataItem)
    ---------------
    container要是范型实现就更好了,就不用转型了

  47. aspnetx
    *.*.*.*
    链接

    aspnetx 2007-12-22 23:45:00

    @Jeffrey Zhao
    我一直搞不懂,为什么企业级业务系统很难容忍webform呢?它们的特点究竟是什么呢?
    ------------------------------------
    其实,我完全同意赵哥文章里的观点,要不然咱也不能一直这么的支持微软对吧?但是,当看到身边的很多业务系统,没有一个是webform时,甚至没有一个是asp.net时,或者没有一个是.net时,甚至你的老板找你谈话你不转j2ee你就离职的时候时,咱们会是什么心情呢?
    微软在中国大陆的销售份额很低,所以对于类似的技术推广投入不是很大,这个咱们不提,因为也不是咱们关心的事,咱们的想法左右不了microsoft的DPE.不过,事实是什么呢?就我所接触的派出所相关业务,从户政到行政案件到刑侦案件到110接处警,没见过一个架构师敢在.net头上动土的,我自己都不愿意接受这样一个现实.
    说多了全是牢骚,牢骚发过了,那就好,咱该干啥还干啥去,呵呵,赵哥晚安了先.

  48. SZW
    *.*.*.*
    链接

    SZW 2007-12-22 23:46:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    SZW:
    @Jeffrey Zhao
    我说的报表除了“财务报表”那种直接用来看的,还会涉及到一些操作,一些ItemCommand等等,这些是必须要产生ViewState的,所以我对这个简直是……(还是不要说出来了)
    --------------------------------------------------------
    那么用MVC对这点有帮助吗?
    --------------------------------------------------------


    MVC至少以“指令性”的URL替代了我们PostBack回去的ItemCommandName,至于数据,MVC是不直接处理页面数据的(这也是MVC不是用ViewState的原因),在Controller里面直接处理,效率上来说,反正每次都是要读数据库,所以剩下来的时间就是数据传输了。

    因为我十分……ViewState,所以通常我还是回去避免,比如专门传入一个Action=bl&id=xx到某个页面,负责处理,但这样其实维护很麻烦,而MVC其实就已经(顺带)解决了这个问题

  49. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-22 23:46:00

    @Jeffrey Zhao
    哦?老赵已经开始创业啦?没听你说过嘛,还是我没有看到啊?
    如果是的,预祝你创业成功!
    现在园子里面创业的人越来越多了,包括我
    也正在奋斗着.......

  50. Anders Cui
    *.*.*.*
    链接

    Anders Cui 2007-12-22 23:49:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    顺便向老赵讨论个问题,如果if{}else{}判断比较繁琐的话,值不值得用try{}catch{}来(if里面可以报错)?很久前就想找人讨论一下,今天突然又碰到了才想起来

    补充说明一下:if里面也不是相当繁琐,用了if就可以避免报错,老赵有碰到过吗?
    --------------------------------------------------------
    这种情况下,最好不要用try/catch,首先是异常所带来的性能问题;其次,我感觉异常通常用于报告API的用户输入值的无效;另外,try会隐藏很多问题,异常可能是数据库返回null引起的,也有可能不是。

  51. 老赵
    admin
    链接

    老赵 2007-12-22 23:54:00

    --引用--------------------------------------------------
    jt: 我想你是想结合ddd和webform,做法挺好,我要借鉴.

    交流的确有帮助,我对webform有所改观,谢谢你 老赵,呵呵
    --------------------------------------------------------
    其实.net并没有影响任何开发方式设计模式等等,它的基础不比Java差,可能在这个基础上所产生的框架少了一些(不过也慢慢好起来的阿)。:)

  52. 老赵
    admin
    链接

    老赵 2007-12-22 23:55:00

    --引用--------------------------------------------------
    aspnetx:
    其实,我完全同意赵哥文章里的观点,要不然咱也不能一直这么的支持微软对吧?但是,当看到身边的很多业务系统,没有一个是webform时,甚至没有一个是asp.net时,或者没有一个是.net时,甚至你的老板找你谈话你不转j2ee你就离职的时候时,咱们会是什么心情呢?
    微软在中国大陆的销售份额很低,所以对于类似的技术推广投入不是很大,这个咱们不提,因为也不是咱们关心的事,咱们的想法左右不了microsoft的DPE.不过,事实是什么呢?就我所接触的派出所相关业务,从户政到行政案件到刑侦案件到110接处警,没见过一个架构师敢在.net头上动土的,我自己都不愿意接受这样一个现实.
    说多了全是牢骚,牢骚发过了,那就好,咱该干啥还干啥去,呵呵,赵哥晚安了先.
    --------------------------------------------------------
    原来是这个原因啊……唉还是互联网应用来的纯粹。

  53. 老赵
    admin
    链接

    老赵 2007-12-22 23:58:00

    --引用--------------------------------------------------
    SZW:
    @Jeffrey Zhao
    MVC至少以“指令性”的URL替代了我们PostBack回去的ItemCommandName,至于数据,MVC是不直接处理页面数据的(这也是MVC不是用ViewState的原因),在Controller里面直接处理,效率上来说,反正每次都是要读数据库,所以剩下来的时间就是数据传输了。

    因为我十分……ViewState,所以通常我还是回去避免,比如专门传入一个Action=bl&id=xx到某个页面,负责处理,但这样其实维护很麻烦,而MVC其实就已经(顺带)解决了这个问题
    --------------------------------------------------------
    恩,原来是这样啊……但是就少了GridView那种所见即所得的体验了。对于目前的项目,我一般会写一个Helper来协助生成目标URL,然后配合URL Rewrite,还是很方便的。

  54. 老赵
    admin
    链接

    老赵 2007-12-22 23:59:00

    --引用--------------------------------------------------
    stonezhu: @Jeffrey Zhao
    哦?老赵已经开始创业啦?没听你说过嘛,还是我没有看到啊?
    如果是的,预祝你创业成功!
    现在园子里面创业的人越来越多了,包括我
    也正在奋斗着.......
    --------------------------------------------------------
    创业要低调……成功后再说……

  55. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 00:01:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    SZW: 缓存确实也是.NET3.5值得关注的一个方面,支持stonezhu ^_^
    --------------------------------------------------------
    .NET 3.5对于缓存有什么新的功能吗?
    --------------------------------------------------------

    目前似乎没有什么官方提供的能让人耳目一新功能(无非是页面级数据级缓存之类),但是从2.0到3.5的一些新功能的跨度还是比较大的(如果用过3.0可能还好一点,我是直接从2.0到3.5,3.0都没关注),多了不少东西,所以比较期待缓存方面是否能有一些更好的应用和表现

  56. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-23 00:02:00

    @Jeffrey Zhao
    有理,做人要低调......,尔尔唱一下高调:-D

  57. uig[未注册用户]
    *.*.*.*
    链接

    uig[未注册用户] 2007-12-23 00:08:00

    我现在开发ASP.NET程序,生成数据列表,连Repeater都不用,直接DataReader出数据,循环进StringBuilder,用<%=sbDataList %>,就表现出来了,不知道效率是否更高

  58. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 00:11:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    恩,原来是这样啊……但是就少了GridView那种所见即所得的体验了。对于目前的项目,我一般会写一个Helper来协助生成目标URL,然后配合URL Rewrite,还是很方便的。
    --------------------------------------------------------

    说实话与其让我舒舒服服的开发,我宁可让客户舒服一点,他们好我也好。
    况且有些系统,他们到时候的形式是未知的(这与www的普通“浏览型应用”[不知道有没有这个词,今天过敏了]有些不同),所以对我来说很多时候也抽象惯了。可能和我ASP的开发经历也有点关系,所以对于MVC的接受比较快(虽然我并不喜欢ASP)

    但是很多报表如果让我在WebForm里面放弃那些东西,追求MVC的“效果”,可以做到我崩溃,所以有时候也不得不用

    URL方面,其实MVC(CTP)我倒觉得不是什么亮点,只是把我们要做的放到模板l里去了,其中一部分WebForm也能用(本来就是相通的嘛,废话了)

  59. 老赵
    admin
    链接

    老赵 2007-12-23 00:18:00

    --引用--------------------------------------------------
    uig: 我现在开发ASP.NET程序,生成数据列表,连Repeater都不用,直接DataReader出数据,循环进StringBuilder,用<%=sbDataList %>,就表现出来了,不知道效率是否更高
    --------------------------------------------------------
    可能会更好,但是开发效率上牺牲太大了,而且维护也困难。

  60. 老赵
    admin
    链接

    老赵 2007-12-23 00:21:00

    --引用--------------------------------------------------
    SZW:
    说实话与其让我舒舒服服的开发,我宁可让客户舒服一点,他们好我也好。
    况且有些系统,他们到时候的形式是未知的(这与www的普通“浏览型应用”[不知道有没有这个词,今天过敏了]有些不同),所以对我来说很多时候也抽象惯了。可能和我ASP的开发经历也有点关系,所以对于MVC的接受比较快(虽然我并不喜欢ASP)

    但是很多报表如果让我在WebForm里面放弃那些东西,追求MVC的“效果”,可以做到我崩溃,所以有时候也不得不用

    URL方面,其实MVC(CTP)我倒觉得不是什么亮点,只是把我们要做的放到模板l里去了,其中一部分WebForm也能用(本来就是相通的嘛,废话了)
    --------------------------------------------------------
    这……我又要说了,别人送给你10杨东西,就算只有4样有用你还是赚了了阿,呵呵。

  61. 木野狐(Neil Chen)
    *.*.*.*
    链接

    木野狐(Neil Chen) 2007-12-23 00:24:00

    根据场合选择技术。

    对我而言,经历过的大多数项目分为两种:
    1. 局域网的企业软件开发(OA,MIS,各种管理系统...);
    2. 网站(侧重表现,通常一个页面上无复杂的回调功能)

    情况1,我是这样的:
    GridView, ViewState 猛用,怎么方便怎么来,速度照样飞快,如老赵上篇文章所说,性能瓶颈其实根本不在于 asp.net 生命周期和页面大小。
    如果感觉回调刷新太多(大的复杂的页面),用些 ajax 即可。。。

    情况2:
    Repeater, ListView, 禁用 ViewState,... 怎么节省怎么来。

    MVC 比较适合做第二种,关键是这类通常需要美工配合美化,分离模板比较方便。其实,这种场合用啥流行的 web 开发语言都很好(php, asp, python, ...),只要 MVC 实现的好。

    第一种,用 MVC 很多功能的实现根本就是自裹手脚,当你发现很多地方无法 postback 的时候就知道多么痛苦了。

    ===
    关于 ASP.NET MVC 中 < %.. % > 内联标签的用法,不必太介意了。。几乎稍微强大一点的模板语法都有类似的东西的,只是标签不同而已。所以我觉得 Rick Strahl 这个观点有点表面化。

    其实,大家不喜欢大多数 asp 程序的原因,并不是 < %.. % >,而是因为一般的写法把业务逻辑和表现全部糅合在一起,那样当然乱啦。其实标签只要专门负责模板表现逻辑,还是很好用的啊。

  62. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 00:28:00

    @Jeffrey Zhao
    我只敢说在一定条件下是这样。
    我觉得这个“赚”不“赚”不是那么简单的,比如你提高了开发效率,很多时候会降低使用效率(拿linq to sql来说,当然我只是看了些评论,没有实际测试过,开发的时候单机也感觉不出来),现在做个“貌似很强大”的动态网站,似乎轻而易举,但是一旦出了问题(配上在这种环境中培养起来的程序员),或许维护和修理成本会更大

    总之微软提供了灵活的替代解决方案,总不是坏事

  63. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 00:29:00

    to aspnetx
    asp.net做企业内部应用很好吧,做企业级应用和互联网应用也不是没有案例,那些人怎么那么傻呀,非用java啥的。

  64. 老赵
    admin
    链接

    老赵 2007-12-23 00:30:00

    @木野狐(Neil Chen)
    嗯,MVC和ASP的重要也是关键区别,就是View里只有View,而在开发模式上严格分离了View和Controller以及Model。
    不过我觉得ASP可以通过“文件”来做到模块化,也就是有些文件里就只有逻辑没有View——不过当然还是不如MVC来的纯粹,直接,规范,也易于管理和维护。

  65. 老赵
    admin
    链接

    老赵 2007-12-23 00:32:00

    @SZW
    嗯,多一种选择总是好的。至于一个易于使用的技术造就了“某种开发人员”……开发人员至少也要负起一半责任吧。

  66. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 00:37:00

    呵呵,我对ASP最大的好感就是他让我从黑网站转到编程,很庆幸现在找到了.NET,ASP成了"跳板"(说起跳板,怎么又感觉回到了3389年代了—_—)

  67. 老赵
    admin
    链接

    老赵 2007-12-23 00:39:00

    --引用--------------------------------------------------
    蛙蛙池塘: to aspnetx
    asp.net做企业内部应用很好吧,做企业级应用和互联网应用也不是没有案例,那些人怎么那么傻呀,非用java啥的。
    --------------------------------------------------------
    各方面原因吧,微软起步晚,很多人眼中总是有偏见的。

  68. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 00:40:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: @SZW
    嗯,多一种选择总是好的。至于一个易于使用的技术造就了“某种开发人员”……开发人员至少也要负起一半责任吧。
    --------------------------------------------------------
    这个问题上,环境影响人,而制造这种环境的“人”如何担负起责任,是个问题
    我感觉“某种开发人员”的出现已经不可避免

    睡觉咯,晚安^o^

  69. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 00:43:00

    对了,老赵,我记得好像asp.net生成的clientid有一个icreateid啥的接口来着吧。

  70. 老赵
    admin
    链接

    老赵 2007-12-23 00:54:00

    --引用--------------------------------------------------
    蛙蛙池塘: 对了,老赵,我记得好像asp.net生成的clientid有一个icreateid啥的接口来着吧。
    --------------------------------------------------------
    不知道,没听说过……

  71. stonezhu
    *.*.*.*
    链接

    stonezhu 2007-12-23 01:02:00

    该休息啦,身体要紧哦

  72. bangbang[未注册用户]
    *.*.*.*
    链接

    bangbang[未注册用户] 2007-12-23 01:46:00

    @Jeffrey Zhao
    其实asp.net mvc里面那个foreach内联语法可以用Repeater控件来代替的。
    scottgu举那个例子,只是为了提供一种显示ViewData的方式而已吧。

  73. pk的眼泪
    *.*.*.*
    链接

    pk的眼泪 2007-12-23 01:46:00

    无论白狗黑狗,能看家的就是好狗.

  74. 老赵
    admin
    链接

    老赵 2007-12-23 02:10:00

    --引用--------------------------------------------------
    bangbang: @Jeffrey Zhao
    其实asp.net mvc里面那个foreach内联语法可以用Repeater控件来代替的。
    scottgu举那个例子,只是为了提供一种显示ViewData的方式而已吧。
    --------------------------------------------------------
    对,写的时候太快了,其实我之前已经修改文章了,可惜还是被你指出来了。:P

  75. jt[未注册用户]
    *.*.*.*
    链接

    jt[未注册用户] 2007-12-23 02:15:00

    看到这里,关于mvc我有点疑问
    貌似mvc是解藕,便于分开测试,另外一点也是主要的一点,同个m可以不同的view,比如word把,视图有好多种,除了mvc还用什么合适呢,还真是想不出来.不过web中非要弄个严格的m-v-c的意义大么?java那边肯定得用,他们有模式害怕用得不够呢.mvc是好,不过..,总觉得和现在提倡的它的优点有点出入,aspx和.cs就可以把层次分得挺清楚了,更换视图的应用场景有那些?何况web的view还有css可以控制视图.这点理解的不好,希望大家指正

  76. 老赵
    admin
    链接

    老赵 2007-12-23 02:25:00

    --引用--------------------------------------------------
    jt: 看到这里,关于mvc我有点疑问
    貌似mvc是解藕,便于分开测试,另外一点也是主要的一点,同个m可以不同的view,比如word把,视图有好多种,除了mvc还用什么合适呢,还真是想不出来.不过web中非要弄个严格的m-v-c的意义大么?java那边肯定得用,他们有模式害怕用得不够呢.mvc是好,不过..,总觉得和现在提倡的它的优点有点出入,aspx和.cs就可以把层次分得挺清楚了,更换视图的应用场景有那些?何况web的view还有css可以控制视图.这点理解的不好,希望大家指正
    --------------------------------------------------------
    Web应用是否真的适合MVC的确也经常被人讨论。还有就是CSS控制视图的能力有限,无法单独作为View,就算可以对于开发人员样式控制能力要求太高。MVC框架的一个特点的确是可以选择不同的V(先不论是否有必要吧),但是关于这点我使用WebForms也可以解决,下面我会提到的。还是先漏点口风吧,那就是通过在页面上加载不同用户控件来解决问题,至于一些细节和具体实现方式,我会在下面的文章中具体谈一下。
    我用WebForms实现MVC后,同样可以MVC,同样可以利用到组件模型、事件模型。而且灵活性强,想MVC多视图也可,想纯粹WebForms单一也行,页面全部用MVC也允许,部分用MVC也能做到……

  77. 怪怪
    *.*.*.*
    链接

    怪怪 2007-12-23 06:10:00

    <%= article.Title %>

    这样的写法, 说实话, 真是方便, 我也喜欢用这个配合各种各样自定义的DataSource, 干脆免去aspx.cs, 不过说实话, 确实没有 解耦的彻底.

    另外说实话, 老赵你对阅读者太友好了. 比如页面加载控件这种事, 3年前还算个偏门, ScottGu都已经介绍过这种方案了, 甚至都AJAX化了, 也就说明这种方案已经够初级的了(对于现在.NET开发者应该有的经验来说, ScottGu主要就是搞普及教育嘛), 国内也有不少文章能搜出来, 一个一个全都自己不去学习, 在这干嘛呢?

    要么等着领导逼, 要么等着自己心目中的高手喂. 我不是不愿意分享, 知识是越分享越多的, 分享只对自我有好处. 但是你知道, 我一想起有些程序员的学习状态, 就有点生气...

  78. 怪怪
    *.*.*.*
    链接

    怪怪 2007-12-23 06:12:00

    <asp:Literal /> 解耦的彻底.

    晕倒, 半角发不出来.

  79. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 09:30:00

    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    jt: 看到这里,关于mvc我有点疑问
    貌似mvc是解藕,便于分开测试,另外一点也是主要的一点,同个m可以不同的view,比如word把,视图有好多种,除了mvc还用什么合适呢,还真是想不出来.不过web中非要弄个严格的m-v-c的意义大么?java那边肯定得用,他们有模式害怕用得不够呢.mvc是好,不过..,总觉得和现在提倡的它的优点有点出入,aspx和.cs就可以把层次分得挺清楚了,更换视图的应用场景有那些?何况web的view还有css可以控制视图.这点理解的不好,希望大家指正
    --------------------------------------------------------
    Web应用是否真的适合MVC的确也经常被人讨论。还有就是CSS控制视图的能力有限,无法单独作为View,就算可以对于开发人员样式控制能力要求太高。MVC框架的一个特点的确是可以选择不同的V(先不论是否有必要吧),但是关于这点我使用WebForms也可以解决,下面我会提到的。还是先漏点口风吧,那就是通过在页面上加载不同用户控件来解决问题,至于一些细节和具体实现方式,我会在下面的文章中具体谈一下。
    我用WebForms实现MVC后,同样可以MVC,同样可以利用到组件模型、事件模型。而且灵活性强,想MVC多视图也可,想纯粹WebForms单一也行,页面全部用MVC也允许,部分用MVC也能做到……


    --------------------------------------------------------


    @jt:“不过web中非要弄个严格的m-v-c的意义大么”

    Web中弄MVC(不论是否严格),对我们来说,开发上选择的权衡筹码要远大于使用。
    这也是为什么老赵在下面提到的用WebForm去完成种种“MVC”的效果,基本上都没有问题。

    并且说彻底一点,MVC目前也就是System.Web.Mvc下面的一个命名空间内的内容(且不论MVCToolkit,到时候应该会集成到System.Web或者System.Web.Mvc),所以我们完全有理自己写一个类,取代Web.Mvc。从这点上来说,WebForm转型为“MVC”的“效果”似乎很简单。

    但是WebForm和MVC是同功能不同框架结构的两种架构(或者对我们来说是不同的“开发、使用模式”和“开发、使用感受”)毕竟M-V-C的实现远远不是.aspx和.cs分离可以做到的,即使当初MS推出ASP.NET的时候,如何强调codebehind的优势,但是它在架构上回避不了一个问题(即使你可以不使用,但可能会给你带来不必要的绕弯):如果全部codebehind的话,.cs势必需要担负起同时处理事务逻辑和视图各方面属性的任务。一个是对逻辑的控制,另一个是对视图(服务器控件)的控制。
    这在所有畏“企业级应用”的开发过程中,往往会引发一些麻烦。至少我理想的比较复杂的系统(是视图和逻辑都很复杂,且不论是不是“企业级应用”),应当在美工和处理逻辑(不管是不是一个人完成)尽可能划清界限,第一有利于对逻辑本身的控制(程序员不用去老想着哪个控件要如何,或者这里是别人的范围我不能改),第二这给日后的维护提供了许多的便利,可以做到有的放矢,并且各板块的修改几乎不会相互影响(这点目前的MVC CTP似乎还没有完全做到)。
    这就比如我们为什么常常要小心选择使用const和readonly去定义一个“常量,const更注重持久的比较稳定的值,一旦被编译,全局统一,而readonly在它所在的类被重新编译后,调用它的其他类只是引用地址,并不用重新编译,这种协调的模式就和C-V(当然也有部分M)从原先的codebehind中分离出来的协调方式,就有点像美工和逻辑之间的协调,大家围绕一个标准,进程上又互不影响。

    补充一下,太巧了,有位朋友发了篇关于const和readonly的介绍文章http://www.cnblogs.com/lbq1221119/archive/2007/12/23/1011145.html
    我就不多说了,希望不要跑题:)

  80. 老赵
    admin
    链接

    老赵 2007-12-23 10:05:00

    @SZW
    我还是不觉得使用WebForms难以做到你说的这些,比如美工和逻辑之间的协调,或者在使用时会绕不必要的弯路。我说的用WebForms实现MVC也并不是指cs和aspx的分离。
    我这几天也好好观察了一下MVC框架,的确有他的优点,但是不是在这方面。WebForms出现也超过五年了,该出现的问题也早就出现了,怎么会一直处理不好呢?

  81. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 10:33:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: @SZW
    我还是不觉得使用WebForms难以做到你说的这些,比如美工和逻辑之间的协调,或者在使用时会绕不必要的弯路。我说的用WebForms实现MVC也并不是指cs和aspx的分离。
    我这几天也好好观察了一下MVC框架,的确有他的优点,但是不是在这方面。WebForms出现也超过五年了,该出现的问题也早就出现了,怎么会一直处理不好呢?
    --------------------------------------------------------

    WebForm的问题我刚上手几个月就感触很深了(可能和我的开发经历有关),对于有些问题,都是“隐藏”的,就像我说的判断一辆车是否超载不时要看他是否发生车祸。很多问题,除了直观的感受之外,可以按照他的逻辑去判断(WebForm/MVC在小团队测试下,直观上是难分高下的,而等到应用中发现效率问题又为时过晚,就像我当时发现WebForm一些问题时候的感觉。当然VS提供了负载测试功能,还是很不错的)。

    现在说你的上面一句话“WebForms实现MVC也并不是指cs和aspx的分离”,我这个不是真对你说的,是当初ASP.NET给人的一种曲解(即便不是曲解为完整的MVC)。
    你说WebForm做到那些(MVC)效果,不管是理论上还是实际上都是可行的:我们System.Web.MVC开发过程考虑,完全可以在WebForm的基础上,建一个类库,把MVC效果做出来,测试完成后,然后整合到System.Web下面(当然只是一种可行方案。特别像URL重写方面,WebForm已经比较成熟了)。这大概是你说的“不难”。
    所以MVC和WebForm本质的区别并不在技术支持的本身,他们是同根的。最大的区别在于结构(对于我们来说更重要的是开发时的结构,虽然使用上MVC也有其他的优势),可以说结构上,决定了MVC和WebForm的区别。我们甚至可以看作MVC(CTP)是WebForm调整结构之后的产物(按照我上面的MVC开发假设)。所以我们似乎老是没有对在一个点上说,感觉分歧很大。
    我是这么理解你的想法的,不知道对不对:WebForm可以完成MVC的一些效果,但是在完成的过程中,其实你已经用到了MVC的一些思想,既然如此,那么把WebForm改造成MVC又何难,然而,一旦把WebForm改成(趋于)MVC效果,为何就不直接使用MVC呢?
    你举了一个例子,10个礼物,你拿4个,那么另外6个去哪了?如果使用MVC,那么可能是这样的情况:人家只送了你需要的4个,并且可以省去你选择的成本。(当然这里似乎把MVC说的太简单了)

    补充以下,关于.aspx和.cs分离,对于ASP模式来说是一种飞跃,但是还是解决不了逻辑和视图的关系(我们但就考虑大家都使用codehehid的情况,虽然都在aspx页面编辑也行,但那就没有讨论价值了,并且趋向MVC转型的第一步了)。
    我举一个很小例子,美工需要一个button在一个condtition下面不可见,这时候,你需要在.cs里面display=false,然后必须编译,等下一次,逻辑需要修改的时候,除了必须把View一起编译之外,程序员一边开发逻辑,还要一边照顾到那个button的状态,这个在效率上很难以保证,尤其是比较复杂的系统。我是说万一,他们沟通出问题或者由于操作失误,把这个button弄错了,这算不算一种低效?当然比较小的系统这样的问题比较容易避免,但也不能排除他的干扰。
    开发方面,MVC注重的就是明确的分工和比较明确的流程。
    我这里不是说这些WebForm的codebehind做不到,只是MVC在这方面,提供了比WebForm更好的解决方案。当然这是需要成本的,比如MVC前期的开发比WebForm要“繁琐”许多,文件也会增多许多(.aspx/.aspx.cs我们都看作一个文件)

  82. 老赵
    admin
    链接

    老赵 2007-12-23 10:50:00

    @SZW
    为什么你总是认为WebForms里面用到了MVC,就还不如用MVC呢?我用了MVC的思想,为什么就非要用到MVC框架,而抛弃WebForms的优势呢?这和认为“抛弃了ViewState和PostBack用WebForms就没有意义了”有什么区别呢?WebForms里的大量优势还是在的阿。MVC是理念,是逻辑上职责上的分离,和MVC框架与否,WebForms与否都没有任何关系。你这样也会误导初学者,好像MVC和MVC框架是同样的东西,而且已经有人分不清了……
    现在的状况是,通过有用的4个礼物的组合,我能得到另外一个人送给的3件礼物中的2个。
    还有你说的那个小例子(button在一个condition下不可见)不会有问题的,你现在所说的WebForms的缺点都是基于“误用”的基础上,但这个并非是WebForms的问题啊。而且正如你说,MVC前期的开发比WebForm要“繁琐”许多,我现在正是保留WebForms的优势而融入MVC理念阿,你说有没有意义?
    还是等我以后把WebForms下MVC方面的东西说完再讨论吧……

  83. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 10:59:00

    @Jeffrey Zhao
    我觉得你对MVC的理解似乎也有点误区,MVC完全可以完成WebForm的几乎所有同样的功能和方法(即便是ViewState和PostBack,MVC也能用),只要包含在form/server中就可以。
    我并不是说WebForm实现一些MVC的效果就一定要完全使用MVC,毕竟MVC的开发成本可能不会比WebForm低(目前来看,很长一段时间都会这样)。我的意思是说,如果你把WebForm去实现一些MVC的功能,而去回避ViewState和PostBack,那就是我看中MVC的原因,因为MVC天生就解决了这个问题。这样我们就说到一点上来了

  84. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 11:03:00

    @Jeffrey Zhao
    MVC是理念,是逻辑上职责上的分离,和MVC框架与否,WebForms与否都没有任何关系
    =============================

    所以我一直在强调,我说的MVC是ASP.NET MVC CTP,所以才会谈到PostBack,如果是别的什么,哪会有ViewState,PostBack
    应为目前我也只是在比较ASP.NET下面两种框架
    至于更大范围的MVC,网上资料已经够多了

  85. 老赵
    admin
    链接

    老赵 2007-12-23 11:04:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    我觉得你对MVC的理解似乎也有点误区,MVC完全可以完成WebForm的几乎所有同样的功能和方法(即便是ViewState和PostBack,MVC也能用),只要包含在

    中就可以。
    我并不是说WebForm实现一些MVC的效果就一定要完全适用MVC,毕竟MVC的开发成本可能不会比WebForm低(目前来看,很长一段时间都会这样)。我的意思是说,如果你把WebForm去实现一些MVC的功能,而去回避ViewState和PostBack,那就是我看中MVC的原因。这样我们就说到一点上来了
    --------------------------------------------------------
    呵呵,不多说了,总之就是,我说的在WebForm里实现的MVC不是MVC框架能够(轻松)替代的(除非以后微软将两者结合在一起)。WebForms是一个灵活的,比MVC框架要庞大许多的架构,自然能实现MVC的理念(注意不是MVC框架)。MVC框架很难做到WebForms的组件模型,它的优势更在于在某些情况下更适合Web开发(的概念或工作方式),但这并不能说明WebForms哪里不好,不适应Web开发。

  86. 老赵
    admin
    链接

    老赵 2007-12-23 11:05:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    MVC是理念,是逻辑上职责上的分离,和MVC框架与否,WebForms与否都没有任何关系
    =============================
    所以我一直在强调,我说的MVC是ASP.NET MVC CTP,所以才会谈到PostBack,如果是别的什么,哪会有ViewState,PostBack
    --------------------------------------------------------
    那么我想,“在WebForms里实现MVC还不如使用MVC框架”这句话不攻自破了吧。

  87. 老赵
    admin
    链接

    老赵 2007-12-23 11:06:00

    --引用--------------------------------------------------
    怪怪: <asp:Literal /> 解耦的彻底.

    晕倒, 半角发不出来.
    --------------------------------------------------------
    可以阿,那么就用Literal,呵呵。

  88. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 11:08:00

    @Jeffrey Zhao
    这是我讲的吗?我从来没有这个意思阿,难道打错字了?

  89. 老赵
    admin
    链接

    老赵 2007-12-23 11:09:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    这是我讲的吗?我从来没有这个意思阿,难道打错字了?
    --------------------------------------------------------
    嗯,81楼你是这么说的:“我是这么理解你的想法的,不知道对不对:WebForm可以完成MVC的一些效果,但是在完成的过程中,其实你已经用到了MVC的一些思想,既然如此,那么把WebForm改造成MVC又何难,然而,一旦把WebForm改成(趋于)MVC效果,为何就不直接使用MVC呢? ”
    为什么我把WebForms里利用MVC不如直接使用MVC呢?

  90. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 11:14:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    呵呵,不多说了,总之就是,我说的在WebForm里实现的MVC不是MVC框架能够(轻松)替代的(除非以后微软将两者结合在一起)。WebForms是一个灵活的,比MVC框架要庞大许多的架构,自然能实现MVC的理念(注意不是MVC框架)。MVC框架很难做到WebForms的组件模型,它的优势更在于在某些情况下更适合Web开发(的概念或工作方式),但这并不能说明WebForms哪里不好,不适应Web开发。
    --------------------------------------------------------

    我也从来没有说WebForms不适应Web开发。但是“哪里不好”,在一些情况下确实是他的弊端,这个是事实。即使你去回避了,那也是MVC本来就要求的,那么一个是方法,一个是整套解决方案,他们就有点殊途同归了。
    适不适应Web开发也不是光一个结构或者理念可以决定的,还必须考虑到他的使用环境和开发对象。甚至我敢说有些条件下,html静态页面编写已经足以。

  91. 老赵
    admin
    链接

    老赵 2007-12-23 11:18:00

    --引用--------------------------------------------------
    SZW:
    我也从来没有说WebForms不适应Web开发。但是“哪里不好”,在一些情况下确实是他的弊端,这个是事实。即使你去回避了,那也是MVC本来就要求的,那么一个是方法,一个是整套解决方案,他们就有点殊途同归了。
    适不适应Web开发也不是光一个结构或者理念可以决定的,还必须考虑到他的使用环境和开发对象。甚至我敢说有些条件下,html静态页面编写已经足以。
    --------------------------------------------------------
    发现其实是我们之前有个观念没有统一:我不介意抛弃6种没有用的礼物,而你喜欢别人只送喜欢的东西给你,呵呵。

  92. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 11:20:00

    @Jeffrey Zhao
    可能是我的话有歧义,我是说,如果同样在WebForm里面,去“改造”成MVC的那些效果(不光是显示效果,还包括V-C的结构,即把.cs里面的一些东西分离出来),就等同于我上面举的例子:先做一个类库,然后整合到Web.Mvc里面,那么和直接用MVC本质上就没有区别了。

    而不是你理解的利用MVC形式就不如用MVC。

  93. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 11:22:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    发现其实是我们之前有个观念没有统一:我不介意抛弃6种没有用的礼物,而你喜欢别人只送喜欢的东西给你,呵呵。
    --------------------------------------------------------
    那么我也可以说MVC远不止你只需要的6种,或许你还有另外4种想要的,却不在这10件中。总之——互补。

  94. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 11:24:00

    @SZW
    虽然你可以用另外4件想办法把你需要的4件弄过来,但是MVC其实已经给你了

  95. 老赵
    admin
    链接

    老赵 2007-12-23 11:25:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    --引用--------------------------------------------------
    发现其实是我们之前有个观念没有统一:我不介意抛弃6种没有用的礼物,而你喜欢别人只送喜欢的东西给你,呵呵。
    --------------------------------------------------------
    那么我也可以说MVC远不止你只需要的6种,或许你还有另外4种想要的,却不在这10件中。总之——互补。
    --------------------------------------------------------
    ……
    ……现在是讨论技术,这么说就没有意思了唉……

  96. 老赵
    admin
    链接

    老赵 2007-12-23 11:27:00

    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    可能是我的话有歧义,我是说,如果同样在WebForm里面,去“改造”成MVC的那些效果(不光是显示效果,还包括V-C的结构,即把.cs里面的一些东西分离出来),就等同于我上面举的例子:先做一个类库,然后整合到Web.Mvc里面,那么和直接用MVC本质上就没有区别了。
    而不是你理解的利用MVC形式就不如用MVC。
    --------------------------------------------------------
    还是不说这些了,我其实对你如何在MVC中实现WebForms里的ViewState,PostBack,组件模型,事件机制比较感兴趣……

  97. 笑疯^_^
    *.*.*.*
    链接

    笑疯^_^ 2007-12-23 11:53:00

    写的非常不错,个人认为做网站应大多用repeat,而系统大多用的是gridview或第三方的列表控件

  98. JerryChou
    *.*.*.*
    链接

    JerryChou 2007-12-23 11:58:00

    老赵的文章就是看得爽,看得明白啊,可惜有些人只知其一,不知其二就大放厥词,不知所云了。

  99. JerryChou
    *.*.*.*
    链接

    JerryChou 2007-12-23 12:12:00

    不知老赵接下来要讲的:四、生成的ID难以使用JavaScript操作。跟我们现在的做法是否相似。
    比如一个省市联动的下拉列表,可以这样引用控件id:
    var provinceCtl = <% = dropProvince.ClientID%>
    而在省市联动的实现js里,使用的是provinceCtl ,这样js就跟页面控件没半点耦合了。

  100. 老赵
    admin
    链接

    老赵 2007-12-23 12:13:00

    --引用--------------------------------------------------
    JerryChou:
    不知老赵接下来要讲的:四、生成的ID难以使用JavaScript操作。跟我们现在的做法是否相似。
    比如一个省市联动的下拉列表,可以这样引用控件id:
    var provinceCtl = <% = txtProvince.ClientID%>
    而在省市联动的实现js里,使用的是provinceCtl ,这样js就跟页面控件没半点耦合了。
    --------------------------------------------------------
    没错,我想说的就像这个一样,呵呵。所以说其实很简单吧。
    不过因为还会涉及一些该如何开发组件方面的问题,所以我还会具体说一下。:)

  101. 随风流月
    *.*.*.*
    链接

    随风流月 2007-12-23 12:21:00

    我从来都是内联脚本控制输出,hoho

  102. 韩现龙
    *.*.*.*
    链接

    韩现龙 2007-12-23 12:28:00

    大家圣诞快乐,老赵注意休息,不要熬夜时间太长。

  103. 老赵
    admin
    链接

    老赵 2007-12-23 12:45:00

    --引用--------------------------------------------------
    随风流月: 我从来都是内联脚本控制输出,hoho
    --------------------------------------------------------
    什么叫内联脚本控制输出?

  104. 老赵
    admin
    链接

    老赵 2007-12-23 12:46:00

    --引用--------------------------------------------------
    韩现龙: 大家圣诞快乐,老赵注意休息,不要熬夜时间太长。
    --------------------------------------------------------
    呵呵,同快乐同快乐:)

  105. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 13:02:00

    @Jeffrey Zhao
    老赵,借贴问个问题,有空回复一下,谢谢。
    一个特别大的div,我用js直接把它的outterHtml赋值为空会不会引起内存泄漏呀?还是要在div的parrentnode里remove掉这个Div呀。

  106. 老赵
    admin
    链接

    老赵 2007-12-23 13:16:00

    @蛙蛙池塘
    outterHTML?不知道是不是跨浏览器。
    如果设置innerHTML的话,造成泄漏的原因大都是因为dom元素和js对象之间的关联没有剥离。如果单单替换html应该不太会造成泄漏的。
    不过这个问题我没有仔细研究过,我说的是我印象中看得资料里的结果。

  107. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 13:29:00

    @Jeffrey Zhao
    OK,谢谢,再问
    asp.net ajax客户端调用webService

    function AgreePost(link, postId)
    {
    WawaSoft.WaTu.Web.AjaxHelperServices.AddPostAgreeHits(postId,onSucceeded);
    }
    function onSucceeded(result) {
    link.outerHTML = "支持" + result;
    }
    其中WawaSoft.WaTu.Web.AjaxHelperServices.AddPostAgreeHits是一个web服务,onSucceeded是它异步回调,
    可我如何把AgreePost的link参数传递给onSucceeded函数呢?

  108. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 13:35:00

    谢谢,不用了,我自己找找答案吧。

  109. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 13:53:00

    哎呀,俺的天内,javascript太好了,写出的代码太优雅了,最后我的脚本如下,太漂亮了,js还能模拟函数式编程,啥时候c#也这么灵活就牛了。
    function AgreePost(link, postId)
    {
    WawaSoft.WaTu.Web.AjaxHelperServices.AddPostAgreeHits(postId,
    function(result,link){
    link.outerHTML = "支持" + result;
    },
    function(error){
    link.outerHTML = error.get_message();
    },
    link);
    }
    给大家推荐两篇文章
    用函数式编程技术编写优美的 JavaScript
    http://www.ibm.com/developerworks/cn/web/wa-javascript.html
    用匿名函数避免命名冲突
    http://home.wangjianshuo.com/cn/20070515_cec.htm

  110. 蛙蛙池塘
    *.*.*.*
    链接

    蛙蛙池塘 2007-12-23 13:59:00

    老赵,等你研究好MVC后,再发一个MVC系列的帖子吧,呵呵。WebForms好,MVC也很好,你现在论证的是WebForms就够用了。

  111. 老赵
    admin
    链接

    老赵 2007-12-23 14:12:00

    @蛙蛙池塘
    你的功能用context对象就可以了。C#你可以关注一下匿名委托,可以做到类似的效果。

  112. 老赵
    admin
    链接

    老赵 2007-12-23 14:13:00

    --引用--------------------------------------------------
    蛙蛙池塘: 老赵,等你研究好MVC后,再发一个MVC系列的帖子吧,呵呵。WebForms好,MVC也很好,你现在论证的是WebForms就够用了。
    --------------------------------------------------------
    好啊,不过先等我这个写完,呵呵。

  113. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 14:32:00

    --引用--------------------------------------------------
    Jeffrey Zhao: 还是不说这些了,我其实对你如何在MVC中实现WebForms里的ViewState,PostBack,组件模型,事件机制比较感兴趣……
    --------------------------------------------------------

    我还是那个观点,其实就Web开发本身,并没有那么多不同,所谓“企业级应用”和MVC等等,都是在实际开发实践中被强化分离出来的,对于实现基础的本身,在ASP.NET框架内并没有太大差异,差异在于他们处理逻辑的流程和板块的分工方式.MVC的出现并不是为了解决技术问题,而是实际开发和操作问题,它们之间是相通的。
    MVC实现ViewState+PostBack(换句话说是实现WebForm中的一些“特性”功能)只需要你把Controller抛在一边,继续在.aspx.cs中开发(codebehind),把所有的服务器控件装入form/server(顺便提一点,MVC在一个网页内允许多个form,这点有点像ASP和普通的网页,所以对于表单提交的效率还是比较高的),你就可以和WebForm上面一样使用ViewState+PostBack,但是MVC思想本身是不提倡这么做的(不然就没有分M-V-C的必要了),所以似乎在设计MVC(CTP)框架的时候,把这方面回避了一下,但是还是可以用(当作一个bug处理一下就行):http://www.cnblogs.com/szw/archive/2007/12/19/1005860.html (见第一点)

  114. 老赵
    admin
    链接

    老赵 2007-12-23 14:39:00

    @SZW
    没明白,给个示例吧,呵呵。
    还有就是ASP.NET,MVC框架和WebForms三者是完全不同的概念。而MVC的执行引擎和WebForms是不同的,所以不能说他们在ASP.NET框架内并没有太大差异。MVC用aspx作为模版,其实也是一种“模拟”或者“复用”——已经不是WebForms了,虽然“模拟”能够带来一定的WebForms特点。
    这就好像WebForm是无法做到MVC框架的工作方式的,但是可以模拟,可以体现MVC模式(不是框架)的设计。我在WebForms里实现MVC也不会仅仅去迎合MVC框架的做法,而是要解决开发中比如程序员和美工的配合等方面遇到的问题,当然还要保留WebForms自身的优点。

  115. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 14:52:00

    @Jeffrey Zhao
    是你没有理解我的意思吧?我是说你想要实现的功能上,他们都是共享很多的功能的,这点我之前已经有过说明了,目前的MVC(CTP)的功能都被定义到了System.Web.Mvc和一些Helper中进行了扩展,难道这就说MVC只能使用System.Web.Mvc命名空间内的的东西吗?不是的,WebForm可以使用的,MVC大部分都能使用。
    至于ASP.NET,MVC框架和WebForms三者的关系,我只是想强调,我们现在讨论的MVC或WebForms都是在ASP.NET技术范围内,不然就扯开去了。

    Scott有一篇文章你可以看一下(应该已经看过了巴?):http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx
    中的 Approach 1: Passing ViewData using the Controller.ViewData Dictionary 他同时提供了codebehind方式绑定和MVCToolkit推荐的形式(其实这种形式也不是最理想的,我之前也提到过了,幸好MVCToolkit提供了一种接入范型的方法,但是还是有很多bug)

  116. SZW
    *.*.*.*
    链接

    SZW 2007-12-23 15:00:00

    --引用--------------------------------------------------
    Jeffrey Zhao: @SZW
    MVC用aspx作为模版,其实也是一种“模拟”或者“复用”——已经不是WebForms了
    --------------------------------------------------------
    破折号后面的同意,至于前面的理由,特别是aspx的“复用”能给出一些解释吗?至少我目前还没有真正感受到

  117. 无名路过[未注册用户]
    *.*.*.*
    链接

    无名路过[未注册用户] 2007-12-23 15:08:00

    --引用--------------------------------------------------
    一见你就笑: 你说你抛弃了DATASET跟DATATABLE..那要怎么做呢..
    谢谢(:
    --------------------------------------------------------
    泛型~啊~

  118. 老赵
    admin
    链接

    老赵 2007-12-23 15:17:00

    --引用--------------------------------------------------
    SZW:
    破折号后面的同意,至于前面的理由,特别是aspx的“复用”能给出一些解释吗?至少我目前还没有真正感受到
    --------------------------------------------------------
    这里的“复用”是指重用了WebForms里的那种写法,也就是为aspx塑造一个以前一样的“运行环境”用来生成HTML,而不用重新写一种模板引擎,呵呵。这样的做法其实对MVC框架的开发者(我们都属于使用者)们是一种省力的做法。我在讲WebForms的MVC是也会提到类似的技术(技巧?)。

  119. 卡卡 ^ cacard
    *.*.*.*
    链接

    卡卡 ^ cacard 2007-12-23 15:40:00

    WebForm的控件尽量不要用,UserControl、Repeater、Button、Text就这几个就够了,什么GridView,见鬼去吧~~

  120. Awen
    *.*.*.*
    链接

    Awen 2007-12-23 19:49:00

    老赵,禁用了viewstate之后,页面还是会有这一句
    input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTcxMDYwMzYwNGRk7aT2uAW1U3NqoTvy5p0Mug89t7k=" /看着不舒服啊,怎样将其去除呢?(注:一个控件都没用到,页面显示用领域模型类的一个集合)

  121. Awen
    *.*.*.*
    链接

    Awen 2007-12-23 20:10:00

    form也是个控件!如果把Form的runat=”server“去掉就行,但是去掉了在里面放按钮写事件就会出错,有没有好的解决方法呢?

  122. Jeffery Huang
    *.*.*.*
    链接

    Jeffery Huang 2007-12-23 20:33:00

    继续关注,呵呵

  123. volnet(可以叫我大V)
    *.*.*.*
    链接

    volnet(可以叫我大V) 2007-12-24 01:14:00

    看完评论花了我大部分的时间……
    看到100多楼的时候才意识到马上就要圣诞了……
    祝福老赵以及博客园的所有朋友圣诞节快乐……(貌似明天才是平安夜,HOHO)

  124. 老赵
    admin
    链接

    老赵 2007-12-24 01:20:00

    @volnet(可以叫我大V)
    平安夜到底是24号晚还是25号晚?

  125. 老赵
    admin
    链接

    老赵 2007-12-24 01:20:00

    --引用--------------------------------------------------
    Awen: form也是个控件!如果把Form的runat=”server“去掉就行,但是去掉了在里面放按钮写事件就会出错,有没有好的解决方法呢?
    --------------------------------------------------------
    去掉了Form的话手写Form总归还是要的。

  126. volnet(可以叫我大V)
    *.*.*.*
    链接

    volnet(可以叫我大V) 2007-12-24 02:56:00

    @Jeffrey Zhao

    --引用--------------------------------------------------
    Jeffrey Zhao: @volnet(可以叫我大V)
    平安夜到底是24号晚还是25号晚?
    --------------------------------------------------------
    是24号晚……(夜太深了,没注意已经是新的一天了,呵呵……)
    如果你的基督教徒的话可以去教堂,许个愿望保个平安,上帝会保佑你的~不知道上海是不是也可以拿个圣火回家,不过要小心火烛噢~
    Christmas Eve



  127. volnet(可以叫我大V)
    *.*.*.*
    链接

    volnet(可以叫我大V) 2007-12-24 02:58:00

    Generation of designer file failed: Databinding expressions are only supported on objects that have a DataBinding event. System.Web.UI.WebControls.TreeNode does not have a DataBinding event.

    数据绑定的方法对树控件无效噢~有一次遇到的问题,至今没有解决……

    类似下面的代码将是错误的,不知道老赵有什么高招:

            <asp:TreeView ID

  128. eidolon[未注册用户]
    *.*.*.*
    链接

    eidolon[未注册用户] 2007-12-24 08:37:00

    终于看到同道中人了,用了5年的Asp.net, Repeater是我最喜欢的控件, 2.0中引入的GridView我几乎没有用过, 现在可以加上ListView了.

  129. zzuyongp[未注册用户]
    *.*.*.*
    链接

    zzuyongp[未注册用户] 2007-12-24 08:53:00

    你只喜欢萝卜不喜欢白菜.

    一般情况,国内的用户注重的是什么??!

  130. 老赵
    admin
    链接

    老赵 2007-12-24 11:18:00

    @zzuyongp
    国内用户注重的东西和具体实现技术又无关,呵呵。

  131. 老赵
    admin
    链接

    老赵 2007-12-24 11:19:00

    @volnet(可以叫我大V)
    你那个是设属性,又不是在页面上写内容,呵呵。

  132. volnet(可以叫我大V)
    *.*.*.*
    链接

    volnet(可以叫我大V) 2007-12-24 13:12:00

    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: @volnet(可以叫我大V)
    你那个是设属性,又不是在页面上写内容,呵呵。
    --------------------------------------------------------
    那对于树形控件需要写在aspx中的情况,用Binding的方式如何实现呢?
    是否有办法对所有的控件如此操作……
    还是说,只能写死?

  133. future001[未注册用户]
    *.*.*.*
    链接

    future001[未注册用户] 2007-12-24 13:23:00

    楼主充Dataset 不用,可谓去其精华!

  134. 老赵
    admin
    链接

    老赵 2007-12-24 13:32:00

    @future001
    呵呵,DataSet精华在什么地方?

  135. 老赵
    admin
    链接

    老赵 2007-12-24 13:35:00

    @volnet(可以叫我大V)
    有篇东西是讲Expression的,可以找一下,这样就能绑定了。

  136. volnet(可以叫我大V)
    *.*.*.*
    链接

    volnet(可以叫我大V) 2007-12-25 02:32:00

    http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx
    找到的这个链接相当不错,虽然很基础,但是我觉得值得复习,起码我相信很多人即使看过它也早也忘记了……


    另外,老赵你说的Expression是不是指《% $.......%》呢?(不过我的疑问貌似在上面的文章内就解决了……)(真郁闷,打个特殊标记就这么难)

  137. 老赵
    admin
    链接

    老赵 2007-12-25 02:42:00

    --引用--------------------------------------------------
    volnet(可以叫我大V): http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx
    找到的这个链接相当不错,虽然很基础,但是我觉得值得复习,起码我相信很多人即使看过它也早也忘记了……
    另外,老赵你说的Expression是不是指《% $.......%》呢?(不过我的疑问貌似在上面的文章内就解决了……)(真郁闷,打个特殊标记就这么难)
    --------------------------------------------------------
    就是上面文章里写的Expression Syntax啊,你要的情况应该是需要自定义的。

  138. 五味果
    *.*.*.*
    链接

    五味果 2007-12-28 17:44:00

    讲的太对了,我最近也刚体会到这块。用户控件,repeter确实很好用。其实看看petshop的代码,生成的页面代码也没有那些冗余的代码。鄙视那种对一个东西不了解而轻易评论的人。

  139. SuperJ[未注册用户]
    *.*.*.*
    链接

    SuperJ[未注册用户] 2008-01-21 10:36:00

    能说说你不用POSTBACK的原因吗?

    PostBAck很方便啊.
    一个页面若有很多提交按钮,难道要像ASP一样用request switch case 操作??

    postback不是更方便?

  140. 老赵
    admin
    链接

    老赵 2008-01-21 16:09:00

    @SuperJ
    该用的地方自然还是要用的咯?

  141. yjmyzz[未注册用户]
    *.*.*.*
    链接

    yjmyzz[未注册用户] 2008-02-24 22:47:00

    今天才看到这篇文章,弱弱的问一下,舍弃GridView后,类似GridView中直接允许编辑每行数据的功能如何处理比较好?类似问题:DropDownList禁用ViewState后,再次提交时,如何保持上次选中的状态?。。。 我能想到的就是退回到asp时代的做法,但想知道还有其它更好的办法么?

  142. 老赵
    admin
    链接

    老赵 2008-02-24 23:34:00

    @yjmyzz
    GridView的话,每次绑定一下就可以了,麻烦些而已。
    DropDownList建议重写一个,我很不爽现在的实现,明明我只要一个SelectedIndex,却要那么多额外的数据……

  143. Mouhong.Lin
    *.*.*.*
    链接

    Mouhong.Lin 2008-03-12 18:39:00

    我是一个ASP.NET的初学者,看了楼主的文章受益匪浅啊

  144. 凌风
    *.*.*.*
    链接

    凌风 2008-03-28 09:58:00

    最近看了你很多文章了。
    感觉你的写作非常好了。呵呵。原来我经常看TerryLee的文章,都非常不错。
    博客园中MVP还不少,但是我在想你们能不能以一个实际的例子"深度剖析"一下实际项目开发中可能遇到或者是需要多注意的地方。比如就以目前博客园这个网站为例。当然这只是建议了。

  145. 老赵
    admin
    链接

    老赵 2008-03-28 10:44:00

    @凌风
    多谢您的建议

  146. 02320131[未注册用户]
    *.*.*.*
    链接

    02320131[未注册用户] 2008-05-15 22:28:00

    小弟拜读了,所谓前人种树后人乘凉,有前辈的脚印我们就少走很多弯路了!

  147. Sadly_Lee
    *.*.*.*
    链接

    Sadly_Lee 2008-06-01 20:52:00

    今天才看天老赵的文章啊,
    突然有一种找到知己的感觉啊,
    我也是用这种方式开发Web的
    http://bbs.febbs.net

  148. 思然
    *.*.*.*
    链接

    思然 2008-07-09 15:35:00

    看了您的文章我也开始过多关注起Repater控件了,以前只会研究GridView嘿嘿..不过我有个疑问如果我把Repater的ViewState关掉了那ItemCommand等事件就用不了,那删除不是用不了吗,感觉只是个显示的容器的,难道非要把删除按钮放在Repater外面用选中的方法去做删除等功能了吗?

  149. 云淡风轻-.net
    *.*.*.*
    链接

    云淡风轻-.net 2009-07-24 19:49:00

    不错,绝对相信的魄力,跟我的想法很投入

  150. xland
    *.*.*.*
    链接

    xland 2009-08-20 18:39:00

    @Jeffrey Zhao
    最近在学mvc
    以前开发asp.net的时候
    我一直都在用这种内联的方式写界面
    你说的repeater和listView也基本不用

    <ul> <% foreach (Article article in this.GetArticles())
       { %>
            <li>
                <img src="<%= "http://img.jeffz.net/" + article.ImagePath %>"
                    alt="<%= article.Title %>" />
            </li>
    <% } %>
    </ul>
    

  151. 链接

    nech 2010-12-10 16:45:39

    说的好...我就一真用纯Repeater等东西...

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我