西西河

主题:请教ASP.NET编程的大牛 (拜托转相关版面) -- 吴刚看你跳舞

共:💬24 🌺14 新:
分页树展主题 · 全看 下页
  • 家园 请教ASP.NET编程的大牛 (拜托转相关版面)

    你们是怎么解决statelessAsynchronous问题的?

    比如说,我正在看一个bbs,点了“回复”按钮,要回复一个帖子,可是在我看帖子到我点按钮这中间,帖子的主人已经删除了这个帖子。这样当我postback的时候,重新生成的页面就对不上原来的页面了,“回复”按钮也对不上。这种情况应该怎样避免?多谢


    本帖一共被 1 帖 引用 (帖内工具实现)
    • 家园 贴子是有ID的嘛,回复时检查一下这个ID还在不在,不在就返回错误
    • 家园 看来很多人不熟.NET编程

      我也就能说个大概

      .NET的最大好处是微软封装了SERVER和CLIENT之间同步的细节。所以当你使用server side control即WebControl搭建Web page,而且page的AutoEventWireup="True"时,你就不用操心了。

      大致做法如下:像西西河,你点“回复”按钮后生成一新页面用于写回复的内容。用WebControl作该页的提交按钮。当帖子的状态发生变化时(日本人的叫法:当周边有事时),在server端,重复一遍,在server端call

      提交按钮.Enabled = False

      .NET负责灰掉browser上的按钮。这样,回复帖就自然贴不上了。

    • 家园 这跟ASP.NET无关

      管你PHP,ASP还是JAVA,在客户端存在的内容,如果服务器端被删除了,没有服务端去主动或者被动PUSH客户端,客户端永远不能知道服务器端发生了什么.

    • 家园 在后台的数据库里把原始贴id作为回帖的一部分

      开新贴自己指自己

    • 家园 继续请教,兼谢谢懒厨,铁手,请尽量

      各位高手建议的,比较经典的在数据库端作标记的pattern,实际上是:

      update修改过的数据条目,并且标记修改的时间。也就是说数据内容已经改了,我们只有“改”的信息,但是找不回未改之前的数据。这样对于经典的bbs就足够好了。

      比如说

      [SIZE=3]1请教ASP.NET编程的大牛 (拜托转相关版面) 吴刚看你跳舞 2007-07-28 14:21:24

      你们是怎么解决statelessAsynchronous问题的? http://www.cchere.com/thread/1144853

      比如说,我正在看一个bbs,点了“回复”按钮,要回复一个帖子,可是在我看帖子到我点按钮这中间,帖子的主人已经删除了这个帖子。这样当我postback的时候,重新生成的页面就对不上原来的页面了,“回复”按钮也对不上。这种情况应该怎样避免?多谢

      [COLOR=red]转发 回复讨论 主题留言 修改 [花]↑0 草↓0 [收]→工[/COLOR][/SIZE]

      这里面的UI端的,可以用作postback的选项:转发,回复讨论,主题留言等等,现在都是js 打开新页面,其实和我的问题不相干(不考虑窗口间通讯的话)。但是假如客户就要求在一个页面里做,那就很可能要postback,(javascript call webservice 的情况等下再说)。

      现在 故事一开始了:

      sequence:

      1.userA loaded page

      2.userB deleted this record (mark IsDeleted 1)

      3.userA clicked "回复讨论" 按钮,postback

      这个情况是没有问题的,懒厨和铁手给出的办法都好用。

      具体过程是这样的:if IsPostback,按照asp.net的规矩,重新生成页面(蠢事),要求这个页面跟当初发送给客户端的页面完全一致。然后系统会报(从客户端来)哪个html元素A被激活了导致postback,再从 新生成的页面里把这个元素A'挑出来,这时候A'和他生成时的数据对象A''还绑在一起,我们就可以对A''下手了。最后系统把整个页面对象转成html,发回客户端。

      故事一中,userA click "回复讨论" 按钮,postback以后,因为数据库里还没删掉这条记录,所以还可以生成和当初一致的帖子对象,所以可以“追溯”到是哪个帖子的"回复讨论" 按钮引发的事件。对此事件的处理中,再检验是不是已删除,要不要报告客户端之类的。整个流程都没有问题。

      没有问题的关键是:中间这一步:“追溯”到是哪个帖子的"回复讨论" 按钮引发的事件, 并不需要知道帖子被修改前的内容。也就是说数据内容已经改了,我们只有“改”的信息,但是找不回未改之前的数据,没有关系。

      可是故事二来了:

      铁手加了个规矩:只有帖子里有加粗字段的,才会有“回复讨论”选项,我这个帖子里有加粗记号。

      sequence:

      1.userA loaded page,page里这个帖子,有“回复讨论”选项,

      2.userB changed this record,deleted all BOLD signals。

      3.userA clicked "回复讨论" 按钮,postback

      4.Server regenerated page

      5.Server can not understand which 帖子 cause this event

      ........

      所以我的问题不是怎样在数据库端维护完整性,而是怎么认识html元素引发的事件,并把它跟数据条目联系起来。所以我才说stateless是万恶之源。

      我想过好多种解决办法,都有问题:

      1)还在数据库里下功夫,把帖子修改前的内容也存下来,override update,变成insert。这要是碰上复杂一些的relationship。。。。。

      2)一个session,一个dataset,存在staticObjects里,把问题转嫁到后端去。dataset吃内存很可怕的

      3)Multi version Caching of User Control。 这个适用范围不广。首先event recognzing 就有问题,其次照顾user control hierarchy 特别麻烦。尤其是像我这样,整个网站只有一个页面的。

      4)可能是终极解决办法了,也特别符合fat-client的潮流,就是下定决心,排除万难,去写一个javascript page admin system,比现在市面上的几个都要好,要快,要全面,所有的问题都交给js call webservice, 根本就没有postback, 把浏览器变成你的winform。这么做其实也还过得去,除了一点:所有的business logic都暴露在客户端了。。。。。。。

      5)要不我改学java?可我也不是干这一行的啊,一定要学这么多吗? 哭!!!!!

      • 家园 还是不很明白

        您Postback时,总得Save吧?Save时,查一下状态,状态不对时,可以给出相应的页面吧?用户从新刷新页面时,"回复讨论" 按钮就消失了。不觉得有什么问题啊。

        难道我误解了问题?

        • 家园 还没有到save那一步那

          是我们根本就不知道这个“回复”的按钮是针对哪个帖子的。

          • 家园 我就更糊涂了

            我假设每个帖子都有一个ID(这个ID不是之前所说的GUID or TimeStamp,而是帖子的Primary Key),userB仅仅作修改吧,ID不会变吧?回复讨论怎么会找不到那个帖子呢?

      • 家园 现在看懂了你的问题。看来是和ASP .NET有关

        不过,不太明白在故事二里,为什么你不能让服务器在重新生成页面(第四步)之前判断该页内容已经发生变化了呢?

    • 家园 不懂ASP.NET。不过,这个听起来怎么象是典型的

      多用户数据库的记录更新问题啊?你的这部分代码在准备提交自己的更改前,应该试图锁住你要修改的数据库记录。

      底下懒厨的答复应该指出了解决办法:这个似乎和HTTP没有太大关系

    • 家园 在回复被正式提交之前检查一下被回复的主题还在不在就应该可以了啊
      • 家园 难道一定要走两次吗?

        我现在就是先用webservice先叫一下server,然后再提交的。但是这么做,第一,觉得很怪,第二,其实还是存在不能同步的问题,假如 检查完了-----提交回复之间, 作者删了帖子呢?

        • 家园 不知道您说的问题是否与数据库有关

          要是我来做,删除帖子的操作,我不会删除有关数据记录,而是把那条记录标记成“已删”,这样当您递交会贴的时候,不会存在Referencial integrity的问题。

          产生页面的时候,如果发现记录标记成“已删”,就产生另一个页面就是。

          如果担心太多已删纪录,可以定期清除的。

          • 家园 如果仅是删除就够好了

            谢谢懒厨,这是很好的办法,两三个月清一次就好。

            但假如两个人同时修改一个条目呢,而且条目内容动态决定前端特性,比如说一个日程安排条目如果截止日期在24小时之内,那么前端页面上要可以响闹铃。好,当用户A关闹铃时,后面用户b 已经把截止日期调到两周后了.....

            也就是说要完全解决这个ri问题,我必须得做一个sourceSafe.

            我认为万恶之源都在于http的stateless,想从根子上解决,只有1)session存生成的页面,2)session存datasource。 存page object要大改life cycle,不值得。可是存页面,重新生成event太麻烦,存datasource,内存受不了。请教方家,有没有十全十美 :)的好办法

分页树展主题 · 全看 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河