Spiga

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

2007-12-22 22:41 by Jeffrey Zhao, 8206 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

六、单元测试

Add your comment

148 条回复

    评论共2页: 上一页 1 2 
  1. #101楼 stonezhu      2007-12-22 23:46
    @Jeffrey Zhao
    哦?老赵已经开始创业啦?没听你说过嘛,还是我没有看到啊?
    如果是的,预祝你创业成功!
    现在园子里面创业的人越来越多了,包括我
    也正在奋斗着.......
      回复  引用  查看    
  2. #102楼 SZW      2007-12-22 23:46
    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    SZW:
    @Jeffrey Zhao
    我说的报表除了“财务报表”那种直接用来看的,还会涉及到一些操作,一些ItemCommand等等,这些是必须要产生ViewState的,所以我对这个简直是……(还是不要说出来了)
    --------------------------------------------------------
    那么用MVC对这点有帮助吗?
    --------------------------------------------------------


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

    因为我十分……ViewState,所以通常我还是回去避免,比如专门传入一个Action=bl&id=xx到某个页面,负责处理,但这样其实维护很麻烦,而MVC其实就已经(顺带)解决了这个问题
      回复  引用  查看    
  3. #103楼 Anders Cui      2007-12-22 23:49
    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    顺便向老赵讨论个问题,如果if{}else{}判断比较繁琐的话,值不值得用try{}catch{}来(if里面可以报错)?很久前就想找人讨论一下,今天突然又碰到了才想起来

    补充说明一下:if里面也不是相当繁琐,用了if就可以避免报错,老赵有碰到过吗?
    --------------------------------------------------------
    这种情况下,最好不要用try/catch,首先是异常所带来的性能问题;其次,我感觉异常通常用于报告API的用户输入值的无效;另外,try会隐藏很多问题,异常可能是数据库返回null引起的,也有可能不是。
      回复  引用  查看    
  4. #104楼[楼主] Jeffrey Zhao      2007-12-22 23:54
    --引用--------------------------------------------------
    jt: 我想你是想结合ddd和webform,做法挺好,我要借鉴.

    交流的确有帮助,我对webform有所改观,谢谢你 老赵,呵呵
    --------------------------------------------------------
    其实.net并没有影响任何开发方式设计模式等等,它的基础不比Java差,可能在这个基础上所产生的框架少了一些(不过也慢慢好起来的阿)。:)
      回复  引用  查看    
  5. #105楼[楼主] Jeffrey Zhao      2007-12-22 23:55
    --引用--------------------------------------------------
    aspnetx:
    其实,我完全同意赵哥文章里的观点,要不然咱也不能一直这么的支持微软对吧?但是,当看到身边的很多业务系统,没有一个是webform时,甚至没有一个是asp.net时,或者没有一个是.net时,甚至你的老板找你谈话你不转j2ee你就离职的时候时,咱们会是什么心情呢?
    微软在中国大陆的销售份额很低,所以对于类似的技术推广投入不是很大,这个咱们不提,因为也不是咱们关心的事,咱们的想法左右不了microsoft的DPE.不过,事实是什么呢?就我所接触的派出所相关业务,从户政到行政案件到刑侦案件到110接处警,没见过一个架构师敢在.net头上动土的,我自己都不愿意接受这样一个现实.
    说多了全是牢骚,牢骚发过了,那就好,咱该干啥还干啥去,呵呵,赵哥晚安了先.
    --------------------------------------------------------
    原来是这个原因啊……唉还是互联网应用来的纯粹。
      回复  引用  查看    
  6. #106楼[楼主] Jeffrey Zhao      2007-12-22 23:58
    --引用--------------------------------------------------
    SZW:
    @Jeffrey Zhao
    MVC至少以“指令性”的URL替代了我们PostBack回去的ItemCommandName,至于数据,MVC是不直接处理页面数据的(这也是MVC不是用ViewState的原因),在Controller里面直接处理,效率上来说,反正每次都是要读数据库,所以剩下来的时间就是数据传输了。

    因为我十分……ViewState,所以通常我还是回去避免,比如专门传入一个Action=bl&id=xx到某个页面,负责处理,但这样其实维护很麻烦,而MVC其实就已经(顺带)解决了这个问题
    --------------------------------------------------------
    恩,原来是这样啊……但是就少了GridView那种所见即所得的体验了。对于目前的项目,我一般会写一个Helper来协助生成目标URL,然后配合URL Rewrite,还是很方便的。
      回复  引用  查看    
  7. #107楼[楼主] Jeffrey Zhao      2007-12-22 23:59
    --引用--------------------------------------------------
    stonezhu: @Jeffrey Zhao
    哦?老赵已经开始创业啦?没听你说过嘛,还是我没有看到啊?
    如果是的,预祝你创业成功!
    现在园子里面创业的人越来越多了,包括我
    也正在奋斗着.......
    --------------------------------------------------------
    创业要低调……成功后再说……
      回复  引用  查看    
  8. #108楼 SZW      2007-12-23 00:01
    --引用--------------------------------------------------
    Jeffrey Zhao: --引用--------------------------------------------------
    SZW: 缓存确实也是.NET3.5值得关注的一个方面,支持stonezhu ^_^
    --------------------------------------------------------
    .NET 3.5对于缓存有什么新的功能吗?
    --------------------------------------------------------

    目前似乎没有什么官方提供的能让人耳目一新功能(无非是页面级数据级缓存之类),但是从2.0到3.5的一些新功能的跨度还是比较大的(如果用过3.0可能还好一点,我是直接从2.0到3.5,3.0都没关注),多了不少东西,所以比较期待缓存方面是否能有一些更好的应用和表现
      回复  引用  查看    
  9. #109楼 stonezhu      2007-12-23 00:02
    @Jeffrey Zhao
    有理,做人要低调......,尔尔唱一下高调:-D
      回复  引用  查看    
  10. #110楼 uig[未注册用户]2007-12-23 00:08
    我现在开发ASP.NET程序,生成数据列表,连Repeater都不用,直接DataReader出数据,循环进StringBuilder,用<%=sbDataList %>,就表现出来了,不知道效率是否更高
      回复  引用    
  11. #111楼 SZW      2007-12-23 00:11
    @Jeffrey Zhao
    --引用--------------------------------------------------
    恩,原来是这样啊……但是就少了GridView那种所见即所得的体验了。对于目前的项目,我一般会写一个Helper来协助生成目标URL,然后配合URL Rewrite,还是很方便的。
    --------------------------------------------------------

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

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

    URL方面,其实MVC(CTP)我倒觉得不是什么亮点,只是把我们要做的放到模板l里去了,其中一部分WebForm也能用(本来就是相通的嘛,废话了)
      回复  引用  查看    
  12. #112楼[楼主] Jeffrey Zhao      2007-12-23 00:18
    --引用--------------------------------------------------
    uig: 我现在开发ASP.NET程序,生成数据列表,连Repeater都不用,直接DataReader出数据,循环进StringBuilder,用<%=sbDataList %>,就表现出来了,不知道效率是否更高
    --------------------------------------------------------
    可能会更好,但是开发效率上牺牲太大了,而且维护也困难。
      回复  引用  查看    
  13. #113楼[楼主] Jeffrey Zhao      2007-12-23 00:21
    --引用--------------------------------------------------
    SZW:
    说实话与其让我舒舒服服的开发,我宁可让客户舒服一点,他们好我也好。
    况且有些系统,他们到时候的形式是未知的(这与www的普通“浏览型应用”[不知道有没有这个词,今天过敏了]有些不同),所以对我来说很多时候也抽象惯了。可能和我ASP的开发经历也有点关系,所以对于MVC的接受比较快(虽然我并不喜欢ASP)

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

    URL方面,其实MVC(CTP)我倒觉得不是什么亮点,只是把我们要做的放到模板l里去了,其中一部分WebForm也能用(本来就是相通的嘛,废话了)
    --------------------------------------------------------
    这……我又要说了,别人送给你10杨东西,就算只有4样有用你还是赚了了阿,呵呵。
      回复  引用  查看    
  14. #114楼 木野狐(Neil Chen)      2007-12-23 00:24
    根据场合选择技术。

    对我而言,经历过的大多数项目分为两种:
    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 程序的原因,并不是 < %.. % >,而是因为一般的写法把业务逻辑和表现全部糅合在一起,那样当然乱啦。其实标签只要专门负责模板表现逻辑,还是很好用的啊。

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

    总之微软提供了灵活的替代解决方案,总不是坏事
      回复  引用  查看    
  16. #116楼 蛙蛙池塘      2007-12-23 00:29
    to aspnetx
    asp.net做企业内部应用很好吧,做企业级应用和互联网应用也不是没有案例,那些人怎么那么傻呀,非用java啥的。
      回复  引用  查看    
  17. #117楼[楼主] Jeffrey Zhao      2007-12-23 00:30
    @木野狐(Neil Chen)
    嗯,MVC和ASP的重要也是关键区别,就是View里只有View,而在开发模式上严格分离了View和Controller以及Model。
    不过我觉得ASP可以通过“文件”来做到模块化,也就是有些文件里就只有逻辑没有View——不过当然还是不如MVC来的纯粹,直接,规范,也易于管理和维护。
      回复  引用  查看    
  18. #118楼[楼主] Jeffrey Zhao      2007-12-23 00:32
    @SZW
    嗯,多一种选择总是好的。至于一个易于使用的技术造就了“某种开发人员”……开发人员至少也要负起一半责任吧。
      回复  引用  查看    
  19. #119楼 SZW      2007-12-23 00:37
    呵呵,我对ASP最大的好感就是他让我从黑网站转到编程,很庆幸现在找到了.NET,ASP成了"跳板"(说起跳板,怎么又感觉回到了3389年代了—_—)
      回复  引用  查看    
  20. #120楼[楼主] Jeffrey Zhao      2007-12-23 00:39
    --引用--------------------------------------------------
    蛙蛙池塘: to aspnetx
    asp.net做企业内部应用很好吧,做企业级应用和互联网应用也不是没有案例,那些人怎么那么傻呀,非用java啥的。
    --------------------------------------------------------
    各方面原因吧,微软起步晚,很多人眼中总是有偏见的。
      回复  引用  查看    
  21. #121楼 SZW      2007-12-23 00:40
    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: @SZW
    嗯,多一种选择总是好的。至于一个易于使用的技术造就了“某种开发人员”……开发人员至少也要负起一半责任吧。
    --------------------------------------------------------
    这个问题上,环境影响人,而制造这种环境的“人”如何担负起责任,是个问题
    我感觉“某种开发人员”的出现已经不可避免

    睡觉咯,晚安^o^
      回复  引用  查看    
  22. #122楼 蛙蛙池塘      2007-12-23 00:43
    对了,老赵,我记得好像asp.net生成的clientid有一个icreateid啥的接口来着吧。
      回复  引用  查看    
  23. #123楼[楼主] Jeffrey Zhao      2007-12-23 00:54
    --引用--------------------------------------------------
    蛙蛙池塘: 对了,老赵,我记得好像asp.net生成的clientid有一个icreateid啥的接口来着吧。
    --------------------------------------------------------
    不知道,没听说过……
      回复  引用  查看    
  24. #124楼 stonezhu      2007-12-23 01:02
    该休息啦,身体要紧哦
      回复  引用  查看    
  25. #125楼 bangbang[未注册用户]2007-12-23 01:46
    @Jeffrey Zhao
    其实asp.net mvc里面那个foreach内联语法可以用Repeater控件来代替的。
    scottgu举那个例子,只是为了提供一种显示ViewData的方式而已吧。
      回复  引用    
  26. #126楼 pk的眼泪      2007-12-23 01:46
    无论白狗黑狗,能看家的就是好狗.
      回复  引用  查看    
  27. #127楼[楼主] Jeffrey Zhao      2007-12-23 02:10
    --引用--------------------------------------------------
    bangbang: @Jeffrey Zhao
    其实asp.net mvc里面那个foreach内联语法可以用Repeater控件来代替的。
    scottgu举那个例子,只是为了提供一种显示ViewData的方式而已吧。
    --------------------------------------------------------
    对,写的时候太快了,其实我之前已经修改文章了,可惜还是被你指出来了。:P
      回复  引用  查看    
  28. #128楼 jt[未注册用户]2007-12-23 02:15
    看到这里,关于mvc我有点疑问
    貌似mvc是解藕,便于分开测试,另外一点也是主要的一点,同个m可以不同的view,比如word把,视图有好多种,除了mvc还用什么合适呢,还真是想不出来.不过web中非要弄个严格的m-v-c的意义大么?java那边肯定得用,他们有模式害怕用得不够呢.mvc是好,不过..,总觉得和现在提倡的它的优点有点出入,aspx和.cs就可以把层次分得挺清楚了,更换视图的应用场景有那些?何况web的view还有css可以控制视图.这点理解的不好,希望大家指正
      回复  引用    
  29. #129楼[楼主] Jeffrey Zhao      2007-12-23 02:25
    --引用--------------------------------------------------
    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也能做到……

      回复  引用  查看    
  30. #130楼 怪怪      2007-12-23 06:10
    <%= article.Title %>

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

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

    要么等着领导逼, 要么等着自己心目中的高手喂. 我不是不愿意分享, 知识是越分享越多的, 分享只对自我有好处. 但是你知道, 我一想起有些程序员的学习状态, 就有点生气...
      回复  引用  查看    
  31. #131楼 怪怪      2007-12-23 06:12
    <asp:Literal /> 解耦的彻底.

    晕倒, 半角发不出来.
      回复  引用  查看    
  32. #132楼 SZW      2007-12-23 09:30
    --引用--------------------------------------------------
    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
    我就不多说了,希望不要跑题:)
      回复  引用  查看    
  33. #133楼[楼主] Jeffrey Zhao      2007-12-23 10:05
    @SZW
    我还是不觉得使用WebForms难以做到你说的这些,比如美工和逻辑之间的协调,或者在使用时会绕不必要的弯路。我说的用WebForms实现MVC也并不是指cs和aspx的分离。
    我这几天也好好观察了一下MVC框架,的确有他的优点,但是不是在这方面。WebForms出现也超过五年了,该出现的问题也早就出现了,怎么会一直处理不好呢?
      回复  引用  查看    
  34. #134楼 SZW      2007-12-23 10:33
    @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我们都看作一个文件)
      回复  引用  查看    
  35. #135楼[楼主] Jeffrey Zhao      2007-12-23 10:50
    @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方面的东西说完再讨论吧……
      回复  引用  查看    
  36. #136楼 SZW      2007-12-23 10:59
    @Jeffrey Zhao
    我觉得你对MVC的理解似乎也有点误区,MVC完全可以完成WebForm的几乎所有同样的功能和方法(即便是ViewState和PostBack,MVC也能用),只要包含在form/server中就可以。
    我并不是说WebForm实现一些MVC的效果就一定要完全使用MVC,毕竟MVC的开发成本可能不会比WebForm低(目前来看,很长一段时间都会这样)。我的意思是说,如果你把WebForm去实现一些MVC的功能,而去回避ViewState和PostBack,那就是我看中MVC的原因,因为MVC天生就解决了这个问题。这样我们就说到一点上来了
      回复  引用  查看    
  37. #137楼 SZW      2007-12-23 11:03
    @Jeffrey Zhao
    MVC是理念,是逻辑上职责上的分离,和MVC框架与否,WebForms与否都没有任何关系
    =============================

    所以我一直在强调,我说的MVC是ASP.NET MVC CTP,所以才会谈到PostBack,如果是别的什么,哪会有ViewState,PostBack
    应为目前我也只是在比较ASP.NET下面两种框架
    至于更大范围的MVC,网上资料已经够多了
      回复  引用  查看    
  38. #138楼[楼主] Jeffrey Zhao      2007-12-23 11:04
    --引用--------------------------------------------------
    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开发。
      回复  引用  查看    
  39. #139楼[楼主] Jeffrey Zhao      2007-12-23 11:05
    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    MVC是理念,是逻辑上职责上的分离,和MVC框架与否,WebForms与否都没有任何关系
    =============================
    所以我一直在强调,我说的MVC是ASP.NET MVC CTP,所以才会谈到PostBack,如果是别的什么,哪会有ViewState,PostBack
    --------------------------------------------------------
    那么我想,“在WebForms里实现MVC还不如使用MVC框架”这句话不攻自破了吧。
      回复  引用  查看    
  40. #140楼[楼主] Jeffrey Zhao      2007-12-23 11:06
    --引用--------------------------------------------------
    怪怪: <asp:Literal /> 解耦的彻底.

    晕倒, 半角发不出来.
    --------------------------------------------------------
    可以阿,那么就用Literal,呵呵。
      回复  引用  查看    
  41. #141楼 SZW      2007-12-23 11:08
    @Jeffrey Zhao
    这是我讲的吗?我从来没有这个意思阿,难道打错字了?
      回复  引用  查看    
  42. #142楼[楼主] Jeffrey Zhao      2007-12-23 11:09
    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    这是我讲的吗?我从来没有这个意思阿,难道打错字了?
    --------------------------------------------------------
    嗯,81楼你是这么说的:“我是这么理解你的想法的,不知道对不对:WebForm可以完成MVC的一些效果,但是在完成的过程中,其实你已经用到了MVC的一些思想,既然如此,那么把WebForm改造成MVC又何难,然而,一旦把WebForm改成(趋于)MVC效果,为何就不直接使用MVC呢? ”
    为什么我把WebForms里利用MVC不如直接使用MVC呢?
      回复  引用  查看    
  43. #143楼 SZW      2007-12-23 11:14
    @Jeffrey Zhao
    --引用--------------------------------------------------
    呵呵,不多说了,总之就是,我说的在WebForm里实现的MVC不是MVC框架能够(轻松)替代的(除非以后微软将两者结合在一起)。WebForms是一个灵活的,比MVC框架要庞大许多的架构,自然能实现MVC的理念(注意不是MVC框架)。MVC框架很难做到WebForms的组件模型,它的优势更在于在某些情况下更适合Web开发(的概念或工作方式),但这并不能说明WebForms哪里不好,不适应Web开发。
    --------------------------------------------------------

    我也从来没有说WebForms不适应Web开发。但是“哪里不好”,在一些情况下确实是他的弊端,这个是事实。即使你去回避了,那也是MVC本来就要求的,那么一个是方法,一个是整套解决方案,他们就有点殊途同归了。
    适不适应Web开发也不是光一个结构或者理念可以决定的,还必须考虑到他的使用环境和开发对象。甚至我敢说有些条件下,html静态页面编写已经足以。
      回复  引用  查看    
  44. #144楼[楼主] Jeffrey Zhao      2007-12-23 11:18
    --引用--------------------------------------------------
    SZW:
    我也从来没有说WebForms不适应Web开发。但是“哪里不好”,在一些情况下确实是他的弊端,这个是事实。即使你去回避了,那也是MVC本来就要求的,那么一个是方法,一个是整套解决方案,他们就有点殊途同归了。
    适不适应Web开发也不是光一个结构或者理念可以决定的,还必须考虑到他的使用环境和开发对象。甚至我敢说有些条件下,html静态页面编写已经足以。
    --------------------------------------------------------
    发现其实是我们之前有个观念没有统一:我不介意抛弃6种没有用的礼物,而你喜欢别人只送喜欢的东西给你,呵呵。
      回复  引用  查看    
  45. #145楼 SZW      2007-12-23 11:20
    @Jeffrey Zhao
    可能是我的话有歧义,我是说,如果同样在WebForm里面,去“改造”成MVC的那些效果(不光是显示效果,还包括V-C的结构,即把.cs里面的一些东西分离出来),就等同于我上面举的例子:先做一个类库,然后整合到Web.Mvc里面,那么和直接用MVC本质上就没有区别了。

    而不是你理解的利用MVC形式就不如用MVC。
      回复  引用  查看    
  46. #146楼 SZW      2007-12-23 11:22
    @Jeffrey Zhao
    --引用--------------------------------------------------
    发现其实是我们之前有个观念没有统一:我不介意抛弃6种没有用的礼物,而你喜欢别人只送喜欢的东西给你,呵呵。
    --------------------------------------------------------
    那么我也可以说MVC远不止你只需要的6种,或许你还有另外4种想要的,却不在这10件中。总之——互补。
      回复  引用  查看    
  47. #147楼 SZW      2007-12-23 11:24
    @SZW
    虽然你可以用另外4件想办法把你需要的4件弄过来,但是MVC其实已经给你了
      回复  引用  查看    
  48. #148楼[楼主] Jeffrey Zhao      2007-12-23 11:25
    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    --引用--------------------------------------------------
    发现其实是我们之前有个观念没有统一:我不介意抛弃6种没有用的礼物,而你喜欢别人只送喜欢的东西给你,呵呵。
    --------------------------------------------------------
    那么我也可以说MVC远不止你只需要的6种,或许你还有另外4种想要的,却不在这10件中。总之——互补。
    --------------------------------------------------------
    ……
    ……现在是讨论技术,这么说就没有意思了唉……
      回复  引用  查看    
  49. #149楼[楼主] Jeffrey Zhao      2007-12-23 11:27
    --引用--------------------------------------------------
    SZW: @Jeffrey Zhao
    可能是我的话有歧义,我是说,如果同样在WebForm里面,去“改造”成MVC的那些效果(不光是显示效果,还包括V-C的结构,即把.cs里面的一些东西分离出来),就等同于我上面举的例子:先做一个类库,然后整合到Web.Mvc里面,那么和直接用MVC本质上就没有区别了。
    而不是你理解的利用MVC形式就不如用MVC。
    --------------------------------------------------------
    还是不说这些了,我其实对你如何在MVC中实现WebForms里的ViewState,PostBack,组件模型,事件机制比较感兴趣……
      回复  引用  查看    
  50. #150楼 笑疯^_^      2007-12-23 11:53
    写的非常不错,个人认为做网站应大多用repeat,而系统大多用的是gridview或第三方的列表控件
      回复  引用  查看    
  51. #151楼 JerryChou      2007-12-23 11:58
    老赵的文章就是看得爽,看得明白啊,可惜有些人只知其一,不知其二就大放厥词,不知所云了。
      回复  引用  查看    
  52. #152楼 JerryChou      2007-12-23 12:12
    不知老赵接下来要讲的:四、生成的ID难以使用JavaScript操作。跟我们现在的做法是否相似。
    比如一个省市联动的下拉列表,可以这样引用控件id:
    var provinceCtl = <% = dropProvince.ClientID%>
    而在省市联动的实现js里,使用的是provinceCtl ,这样js就跟页面控件没半点耦合了。
      回复  引用  查看    
  53. #153楼[楼主] Jeffrey Zhao      2007-12-23 12:13
    --引用--------------------------------------------------
    JerryChou:
    不知老赵接下来要讲的:四、生成的ID难以使用JavaScript操作。跟我们现在的做法是否相似。
    比如一个省市联动的下拉列表,可以这样引用控件id:
    var provinceCtl = <% = txtProvince.ClientID%>
    而在省市联动的实现js里,使用的是provinceCtl ,这样js就跟页面控件没半点耦合了。
    --------------------------------------------------------
    没错,我想说的就像这个一样,呵呵。所以说其实很简单吧。
    不过因为还会涉及一些该如何开发组件方面的问题,所以我还会具体说一下。:)
      回复  引用  查看    
  54. #154楼 随风流月      2007-12-23 12:21
    我从来都是内联脚本控制输出,hoho
      回复  引用  查看    
  55. #155楼 韩现龙      2007-12-23 12:28
    大家圣诞快乐,老赵注意休息,不要熬夜时间太长。
      回复  引用  查看    
  56. #156楼[楼主] Jeffrey Zhao      2007-12-23 12:45
    --引用--------------------------------------------------
    随风流月: 我从来都是内联脚本控制输出,hoho
    --------------------------------------------------------
    什么叫内联脚本控制输出?
      回复  引用  查看    
  57. #157楼[楼主] Jeffrey Zhao      2007-12-23 12:46
    --引用--------------------------------------------------
    韩现龙: 大家圣诞快乐,老赵注意休息,不要熬夜时间太长。
    --------------------------------------------------------
    呵呵,同快乐同快乐:)
      回复  引用  查看    
  58. #158楼 蛙蛙池塘      2007-12-23 13:02
    @Jeffrey Zhao
    老赵,借贴问个问题,有空回复一下,谢谢。
    一个特别大的div,我用js直接把它的outterHtml赋值为空会不会引起内存泄漏呀?还是要在div的parrentnode里remove掉这个Div呀。
      回复  引用  查看    
  59. #159楼[楼主] Jeffrey Zhao      2007-12-23 13:16
    @蛙蛙池塘
    outterHTML?不知道是不是跨浏览器。
    如果设置innerHTML的话,造成泄漏的原因大都是因为dom元素和js对象之间的关联没有剥离。如果单单替换html应该不太会造成泄漏的。
    不过这个问题我没有仔细研究过,我说的是我印象中看得资料里的结果。
      回复  引用  查看    
  60. #160楼 蛙蛙池塘      2007-12-23 13:29
    @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函数呢?
      回复  引用  查看    
  61. #161楼 蛙蛙池塘      2007-12-23 13:35
    谢谢,不用了,我自己找找答案吧。
      回复  引用  查看    
  62. #162楼 蛙蛙池塘      2007-12-23 13:53
    哎呀,俺的天内,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
      回复  引用  查看    
  63. #163楼 蛙蛙池塘      2007-12-23 13:59
    老赵,等你研究好MVC后,再发一个MVC系列的帖子吧,呵呵。WebForms好,MVC也很好,你现在论证的是WebForms就够用了。
      回复  引用  查看    
  64. #164楼[楼主] Jeffrey Zhao      2007-12-23 14:12
    @蛙蛙池塘
    你的功能用context对象就可以了。C#你可以关注一下匿名委托,可以做到类似的效果。
      回复  引用  查看    
  65. #165楼[楼主] Jeffrey Zhao      2007-12-23 14:13
    --引用--------------------------------------------------
    蛙蛙池塘: 老赵,等你研究好MVC后,再发一个MVC系列的帖子吧,呵呵。WebForms好,MVC也很好,你现在论证的是WebForms就够用了。
    --------------------------------------------------------
    好啊,不过先等我这个写完,呵呵。
      回复  引用  查看    
  66. #166楼 SZW      2007-12-23 14:32
    --引用--------------------------------------------------
    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" target="_new">http://www.cnblogs.com/szw/archive/2007/12/19/1005860.html (见第一点)
      回复  引用  查看    
  67. #167楼[楼主] Jeffrey Zhao      2007-12-23 14:39
    @SZW
    没明白,给个示例吧,呵呵。
    还有就是ASP.NET,MVC框架和WebForms三者是完全不同的概念。而MVC的执行引擎和WebForms是不同的,所以不能说他们在ASP.NET框架内并没有太大差异。MVC用aspx作为模版,其实也是一种“模拟”或者“复用”——已经不是WebForms了,虽然“模拟”能够带来一定的WebForms特点。
    这就好像WebForm是无法做到MVC框架的工作方式的,但是可以模拟,可以体现MVC模式(不是框架)的设计。我在WebForms里实现MVC也不会仅仅去迎合MVC框架的做法,而是要解决开发中比如程序员和美工的配合等方面遇到的问题,当然还要保留WebForms自身的优点。
      回复  引用  查看    
  68. #168楼 SZW      2007-12-23 14:52
    @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" target="_new">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)
      回复  引用  查看    
  69. #169楼 SZW      2007-12-23 15:00
    --引用--------------------------------------------------
    Jeffrey Zhao: @SZW
    MVC用aspx作为模版,其实也是一种“模拟”或者“复用”——已经不是WebForms了
    --------------------------------------------------------
    破折号后面的同意,至于前面的理由,特别是aspx的“复用”能给出一些解释吗?至少我目前还没有真正感受到
      回复  引用  查看    
  70. #170楼 无名路过[未注册用户]2007-12-23 15:08
    --引用--------------------------------------------------
    一见你就笑: 你说你抛弃了DATASET跟DATATABLE..那要怎么做呢..
    谢谢(:
    --------------------------------------------------------
    泛型~啊~
      回复  引用    
  71. #171楼[楼主] Jeffrey Zhao      2007-12-23 15:17
    --引用--------------------------------------------------
    SZW:
    破折号后面的同意,至于前面的理由,特别是aspx的“复用”能给出一些解释吗?至少我目前还没有真正感受到
    --------------------------------------------------------
    这里的“复用”是指重用了WebForms里的那种写法,也就是为aspx塑造一个以前一样的“运行环境”用来生成HTML,而不用重新写一种模板引擎,呵呵。这样的做法其实对MVC框架的开发者(我们都属于使用者)们是一种省力的做法。我在讲WebForms的MVC是也会提到类似的技术(技巧?)。
      回复  引用  查看    
  72. #172楼 卡卡 ^ cacard      2007-12-23 15:40
    WebForm的控件尽量不要用,UserControl、Repeater、Button、Text就这几个就够了,什么GridView,见鬼去吧~~
      回复  引用  查看    
  73. #173楼 Awen      2007-12-23 19:49
    老赵,禁用了viewstate之后,页面还是会有这一句
    input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTcxMDYwMzYwNGRk7aT2uAW1U3NqoTvy5p0Mug89t7k=" /看着不舒服啊,怎样将其去除呢?(注:一个控件都没用到,页面显示用领域模型类的一个集合)
      回复  引用  查看    
  74. #174楼 Awen      2007-12-23 20:10
    form也是个控件!如果把Form的runat=”server“去掉就行,但是去掉了在里面放按钮写事件就会出错,有没有好的解决方法呢?
      回复  引用  查看    
  75. #175楼 Jeffery Huang      2007-12-23 20:33
    继续关注,呵呵
      回复  引用  查看    
  76. #176楼 volnet(可以叫我大V)      2007-12-24 01:14
    看完评论花了我大部分的时间……
    看到100多楼的时候才意识到马上就要圣诞了……
    祝福老赵以及博客园的所有朋友圣诞节快乐……(貌似明天才是平安夜,HOHO)
      回复  引用  查看    
  77. #177楼[楼主] Jeffrey Zhao      2007-12-24 01:20
    @volnet(可以叫我大V)
    平安夜到底是24号晚还是25号晚?
      回复  引用  查看    
  78. #178楼[楼主] Jeffrey Zhao      2007-12-24 01:20
    --引用--------------------------------------------------
    Awen: form也是个控件!如果把Form的runat=”server“去掉就行,但是去掉了在里面放按钮写事件就会出错,有没有好的解决方法呢?
    --------------------------------------------------------
    去掉了Form的话手写Form总归还是要的。
      回复  引用  查看    
  79. #179楼 volnet(可以叫我大V)      2007-12-24 02:56
    @Jeffrey Zhao

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



      回复  引用  查看    
  80. #180楼 volnet(可以叫我大V)      2007-12-24 02:58
    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="TreeView1" runat="server">
    <Nodes>
    <asp:TreeNode Text='<%# this.node %>' Value="New Node"></asp:TreeNode>
    </Nodes>
    </asp:TreeView>
      回复  引用  查看    
  81. #181楼 eidolon[未注册用户]2007-12-24 08:37
    终于看到同道中人了,用了5年的Asp.net, Repeater是我最喜欢的控件, 2.0中引入的GridView我几乎没有用过, 现在可以加上ListView了.
      回复  引用    
  82. #182楼 zzuyongp[未注册用户]2007-12-24 08:53
    你只喜欢萝卜不喜欢白菜.

    一般情况,国内的用户注重的是什么??!
      回复  引用    
  83. #183楼[楼主] Jeffrey Zhao      2007-12-24 11:18
    @zzuyongp
    国内用户注重的东西和具体实现技术又无关,呵呵。
      回复  引用  查看    
  84. #184楼[楼主] Jeffrey Zhao      2007-12-24 11:19
    @volnet(可以叫我大V)
    你那个是设属性,又不是在页面上写内容,呵呵。
      回复  引用  查看    
  85. #185楼 volnet(可以叫我大V)      2007-12-24 13:12
    @Jeffrey Zhao
    --引用--------------------------------------------------
    Jeffrey Zhao: @volnet(可以叫我大V)
    你那个是设属性,又不是在页面上写内容,呵呵。
    --------------------------------------------------------
    那对于树形控件需要写在aspx中的情况,用Binding的方式如何实现呢?
    是否有办法对所有的控件如此操作……
    还是说,只能写死?
      回复  引用  查看    
  86. #186楼 future001[未注册用户]2007-12-24 13:23
    楼主充Dataset 不用,可谓去其精华!
      回复  引用    
  87. #187楼[楼主] Jeffrey Zhao      2007-12-24 13:32
    @future001
    呵呵,DataSet精华在什么地方?
      回复  引用  查看    
  88. #188楼[楼主] Jeffrey Zhao      2007-12-24 13:35
    @volnet(可以叫我大V)
    有篇东西是讲Expression的,可以找一下,这样就能绑定了。
      回复  引用  查看    
  89. #189楼 volnet(可以叫我大V)      2007-12-25 02:32
    http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx" target="_new">http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx
    找到的这个链接相当不错,虽然很基础,但是我觉得值得复习,起码我相信很多人即使看过它也早也忘记了……


    另外,老赵你说的Expression是不是指《% $.......%》呢?(不过我的疑问貌似在上面的文章内就解决了……)(真郁闷,打个特殊标记就这么难)
      回复  引用  查看    
  90. #190楼[楼主] Jeffrey Zhao      2007-12-25 02:42
    --引用--------------------------------------------------
    volnet(可以叫我大V): http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx" target="_new">http://quickstarts.asp.net/QuickStartv20/aspnet/doc/pages/syntax.aspx
    找到的这个链接相当不错,虽然很基础,但是我觉得值得复习,起码我相信很多人即使看过它也早也忘记了……
    另外,老赵你说的Expression是不是指《% $.......%》呢?(不过我的疑问貌似在上面的文章内就解决了……)(真郁闷,打个特殊标记就这么难)
    --------------------------------------------------------
    就是上面文章里写的Expression Syntax啊,你要的情况应该是需要自定义的。
      回复  引用  查看    
  91. #191楼 五味果      2007-12-28 17:44
    讲的太对了,我最近也刚体会到这块。用户控件,repeter确实很好用。其实看看petshop的代码,生成的页面代码也没有那些冗余的代码。鄙视那种对一个东西不了解而轻易评论的人。
      回复  引用  查看    
  92. #192楼 SuperJ[未注册用户]2008-01-21 10:36
    能说说你不用POSTBACK的原因吗?

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

    postback不是更方便?
      回复  引用    
  93. #193楼[楼主] Jeffrey Zhao      2008-01-21 16:09
    @SuperJ
    该用的地方自然还是要用的咯?
      回复  引用  查看    
  94. #194楼 yjmyzz[未注册用户]2008-02-24 22:47
    今天才看到这篇文章,弱弱的问一下,舍弃GridView后,类似GridView中直接允许编辑每行数据的功能如何处理比较好?类似问题:DropDownList禁用ViewState后,再次提交时,如何保持上次选中的状态?。。。 我能想到的就是退回到asp时代的做法,但想知道还有其它更好的办法么?
      回复  引用    
  95. #195楼[楼主] Jeffrey Zhao      2008-02-24 23:34
    @yjmyzz
    GridView的话,每次绑定一下就可以了,麻烦些而已。
    DropDownList建议重写一个,我很不爽现在的实现,明明我只要一个SelectedIndex,却要那么多额外的数据……
      回复  引用  查看    
  96. #196楼 Mouhong.Lin      2008-03-12 18:39
    我是一个ASP.NET的初学者,看了楼主的文章受益匪浅啊
      回复  引用  查看    
  97. #197楼 凌风      2008-03-28 09:58
    最近看了你很多文章了。
    感觉你的写作非常好了。呵呵。原来我经常看TerryLee的文章,都非常不错。
    博客园中MVP还不少,但是我在想你们能不能以一个实际的例子"深度剖析"一下实际项目开发中可能遇到或者是需要多注意的地方。比如就以目前博客园这个网站为例。当然这只是建议了。
      回复  引用  查看    
  98. #198楼[楼主] Jeffrey Zhao      2008-03-28 10:44
    @凌风
    多谢您的建议
      回复  引用  查看    
  99. #199楼 02320131[未注册用户]2008-05-15 22:28
    小弟拜读了,所谓前人种树后人乘凉,有前辈的脚印我们就少走很多弯路了!
      回复  引用    
  100. #200楼 Sadly_Lee      2008-06-01 20:52
    今天才看天老赵的文章啊,
    突然有一种找到知己的感觉啊,
    我也是用这种方式开发Web的
    http://bbs.febbs.net" target="_new">http://bbs.febbs.net
      回复  引用  查看    
  101. #201楼 思然      2008-07-09 15:35
    看了您的文章我也开始过多关注起Repater控件了,以前只会研究GridView嘿嘿..不过我有个疑问如果我把Repater的ViewState关掉了那ItemCommand等事件就用不了,那删除不是用不了吗,感觉只是个显示的容器的,难道非要把删除按钮放在Repater外面用选中的方法去做删除等功能了吗?
      回复  引用  查看    
  102. 评论共2页: 上一页 1 2 



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1010859




相关文章:

相关链接: