laifangsong's .NET blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 52, comments - 225, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年10月18日

标题好像有点大,同时我也没很多的管理经验,希望下面的例子,能引起大家一点思考...

可以把下面的例子想像成在一个公司,如何处理主管、员工和客户的矛盾。

 

今天中午在餐馆吃饭,3个人点了两样素材和一盘酸菜鱼(不是现杀活鱼,称斤,一盘20元)。
酸菜鱼刚端上来,我就觉得成色不对,明显鱼肉颜色较深,肉也不滑,吃了两块慢慢感觉有中不新鲜的怪味,此时大家都还没发作。
待大家将自己小碗中的鱼吃的差不多时,这种感觉越发强烈,舀起鱼肉仔细端详,意见一致,鱼很不新鲜,于是招呼伙计叫过来理论。
主要由超哥来说,胡哥和我在一旁看老板和伙计会怎么说,呵。

喊了以后,过来一小妹,看起来缺乏应急处理能力,略显紧张和不安,呵。
“小姐,你们这边的鱼不新鲜,你仔细看看!”
“啊...”低下头,捞起鱼肉来仔细看,放下鱼肉,翻动了几次大盆子中的鱼肉,不说话。
“小姐,你叫你们老板过来看看吧,这鱼明显不新鲜,颜色一看很明显,仔细一闻,还有点臭味”
“但这鱼肯定是新鲜的啊,不可能不新鲜...”,小妹有点急,脱口而出。
“不用说了,还是叫你老板过来吧,快点吧..“,看到她也不能做主,我们也急了。
小妹走开后,我们停止吃菜,等老板过来。

本以为对方会马上通知老板,但仔细一看,她还从容地给其他桌的客人上菜呢,大家心里都有点火。
于是喊道“小妹,快点吧,叫老板过来吧”
大约过了半分钟,过来了一个男伙计。
“请问有什么问题吗?”
“这鱼不新鲜,你说下该怎么办吧!”
“怎么可能呢,这鱼是早上刚杀的,绝对新鲜,你们看其他桌的客人也正在吃呢!”
“小弟,你看这个鱼肉,颜色很深,而且一点也不光滑,你说早上刚杀的,我看很难让人相信吧!”,我没怎么说话,蛮插了一句。
“你说新鲜的,那你自己吃吃看!”,超哥说。
另我感到意外的事,那小弟果真端起盆子,舀起鱼肉吃了几口;看他的表情,我感觉他已认识到鱼不新鲜了,只是他没说话。
“你自己也吃过了,不像是早上刚杀出来的吧,还是见见你老板吧”,我微笑地说。

小弟站着迟疑了一会儿,也没说话,接着走开了。小弟和小妹一样,不是急着找老板,刚走开马上给其他桌的客人上菜。
大约等了两分钟,一胖子过来了,穿的比较得体,直觉告诉我他就是老板,但他说老板不在,自己只是临时负责的,晕!
胖子看了下鱼肉,舀动了几下,几乎说了跟男伙计一样的话,就是坚决否认鱼肉不新鲜,只是说话声音比较大,一开始还有点蛮恨。
“....”
“....”
“老板,你看怎么办吧,这鱼就是有问题,还是退掉吧!”
“绝对新鲜,不能退的!,.......那算了,给你们便宜5块吧.”,为了这5块,他嘀咕了很久;我观察周围,其他桌的客人也在看着我们。

最后看退菜没戏,我们就付了钱,带着怨气、扫兴地离开了。


我发觉过程和结果让大家都很不愉快,最近刚看了曾仕强的中国式管理,如果能合理用上,可能不会产生这么多问题。
(虽然上面的例子只是小事,但同样值得思考,呵呵)

1.设想一下当事人的心理。
顾客:
我们发现鱼不新鲜时(已吃了一部分到肚子里),感觉既浪费了钱,又吃了不卫生的东西,可能还会得病,已是满脸怨气;我们期望老板能过来,承认鱼肉不新鲜,并且能道歉,然后
希望这盘鱼能不收钱或者换其他菜。

伙计:
绝对不能承认鱼不新鲜。
如果承认了,需要做出补偿,要请示老板补偿多少,意味着要老板亏钱,如果老板又是不太大方的,他会同意吗?这种让老板赔钱的做法是不是明摆着出卖老板呢?呵!
即便老板同意补偿,老板本人也心里有数,不出来和顾客理论,他心里也不太愉快,“这家伙真是笨蛋,让我亏钱又损坏餐馆的信誉,就应该坚决否认鱼有问题嘛!”
不同意补偿就更糟了,老板肯定会出面,并且矢口否认鱼有问题,那伙计就夹在中间不是人了,你刚才不是承认鱼有问题了吗?老板肯定怒斥伙计:“这鱼能有什么问题,我都吃不出来,你吃的出来!!”
简单分析,我们会发现,如果伙计承认鱼有问题,不管老板出不出面,同不同意赔偿,他都是很倒霉的。

老板:
原则上不承认鱼不新鲜(虽心里有数,但嘴上却矢口否认,或者用默认代表承认,免得自己没有面子),但顾客如果态度强硬、有背景,就需要道歉和补偿。
如果自己是小气之人,顾客讲的也是事实,合情合理,又照顾到餐馆的信誉和自己的面子,就需要道歉和补偿。
其他情况下,一般不道歉也不赔偿。如果当着其他很多客人的面,顾客态度恶劣(但又不是那种有背景,大顾客,非赔偿不可的),指出鱼不卫生,那老板能承认吗?如果承认了,其他在吃鱼的人会怎么想,
会不会一起都感到肚子不适,都要求赔偿呢?那我还要不要做生意啊,这种既破坏声誉,又让自己没面子的事,没人会做的。

2.中国式合理的做法
a)伙计应该怎么做?
   当顾客发现鱼有问题,伙计被叫唤时,伙计应第一时间赶到顾客桌前,表示对顾客问题的重视,然后礼貌地问:“您好,有什么可以为您服务的?”,一句礼貌的话,可以让顾客对该伙计不那么排斥。
同时,这时候伙计就要去琢磨上面讲到的顾客的心理了,要用礼貌的言语、切实的行动先安抚住顾客。中国人的情绪起伏是很大的,如果让他带着情绪和你说话,那他肯定是不讲理的,所以我们在公司开会时,
有经验的人发言的模式都是这样的“某某的想法很好,而且很多都有突破性,但是我有几点私人的看法...”,就是为了照顾前一个发言人的面子,安抚他的情绪。然后伙计可以说:“您说的这个确实很重要,因为之前我们餐馆从来没有顾客反映过这种情况,您稍等,我看看”,
这样说一下,就表示我作为伙计在这个餐馆干了这么久,坚决相信鱼都是很卫生的,这种情况让我感到很意外,维护了餐馆的声誉。然后伙计应该用几秒钟的时间仔细看看鱼肉,有必要的话,可以自己吃几口。不能稍微一瞄就走开去找老板了,这样不是明摆着告诉顾客
“我一瞄,就发现鱼肉有问题了,还用仔细看吗?”;吃几口的目的是,告诉顾客“您放心,我相信鱼肉没多大问题,我自己都吃了几口!”,同时,心里有数,鱼到底是新鲜、不新鲜,不新鲜到什么程度?然后伙计要做的事是,不要评论鱼是否新鲜,马上告诉顾客“您稍等,我马上去找老板!”,
接着要马上离开顾客的视线,让人感觉他是去找老板了,别出现上文中男伙计的做法---刚说完,马上去给其他桌的客人上菜,这样是对顾客的极不尊重.注意,刚才品尝的时候,即使自己觉得鱼是卫生的,也不能说出来,因为顾客已经觉得鱼有问题,情绪很大了,这时候伙计
坚持鱼没问题,肯定要争吵的。伙计找到老板,向他打个招呼,然后站到他旁边,一句话都不说。老板发现伙计过来找他,又不说事,傻站着,一定会很警觉,会问“什么事?”伙计一定要回答:“没有事。”,然后继续傻站在旁边。老板肯定会继续问:“到底什么事啊,快说啊。”这时候
伙计才能说。有人觉得奇怪,伙计直接告诉老板发生了什么事就好了,还跑到老板旁边,有事又说没有,干嘛搞的这么复杂?这样做其实是有用意的,一个是伙计在暗示老板“老板,我本来不该来打搅你的,我都不好意思说,但是事情比较急,既然你一直问我,那我说”,另外可以给老板一点思考的时间,
不让他感觉太突然,老板自己心里会想这小子找我肯定有事,我多问问,听听看是什么事。伙计可以接着说:“老板,其实事情是这样的,5号桌子,3个客人叫了一盘20块的鱼,已经吃了一部分了,但他们都感觉鱼不新鲜,现在每个人火气都很大,他们说老板不出来处理就不走了!其实鱼不新鲜我是绝对不会相信的,
刚才那鱼我也尝了几口,一点事都没有。为了餐馆的利益,我特意来请示您,应该怎么处理?”伙计要夸大客人的怨气,并且给老板面子(鱼不新鲜也要说很新鲜,请老板英明决策)。到这里,伙计要做的事就基本完了,接着把老板带到顾客那里,静观老板处理就行了。

b)老板应该怎么做?
  老板出来后,应首先设想顾客的心理。走到顾客面前,应先打个招呼:“您好,请问什么事情?”。
然后根绝顾客情况酌情处理。
“有背景、蛮横型顾客”:对这种人尽量息事宁人,做点补偿,不要因为小钱引起大的争吵,得罪人。做生意的人都懂得“做生意就是求财嘛,大家以和为贵。”
“老顾客”:这种人对餐馆生意很重要,是中流砥柱,而且只要他们对餐馆满意,会不断介绍新顾客到这边。所以对老顾客,肯定要予以补偿,并且道歉。
“新顾客、势单力薄型”:这种人就比较倒霉了,根据上面分析的老板的心理,加上老板如果很小气,就有可能矢口否认鱼有问题,不做补偿或者仅做一点补偿。但是这种做生意的态度,生意是不长久的,不应该欺软怕硬,应老老实实。
老板看下鱼,也可亲自尝尝,然后可以和顾客上演这样一番对话:“您好,我们卫生工作一直都做的很好,您反应的问题以前从没发生过;但是,我们始终相信,只有顾客的感觉才是最准确的!”然后叫伙计退菜,并且送来几样小菜给顾客。
老板这样做,既维护了店的声誉,又让自己有面子,避免不必要的争吵。同时,我们应该记住,会抱怨的客户才是好客户。

c)顾客应该怎么做?
  顾客发现鱼有问题后,应该故意大声讨论,目的是引起伙计的注意,让他们会主动过来看看发生了什么事。待伙计过来后,顾客可以故意摆出一点难看的脸色,但实际上心里不是在生气,摆脸色目的是告诉伙计:“黎叔很生气,后果很严重,你应该引起重视!”
然后挑开鱼肉给伙计看,说明鱼肉的颜色过深,皮肉明显也不光滑,如实地、有理有据地反应问题。注意,顾客没必要去为难伙计,因为菜有没问题、换不换伙计都是不能做主的,和伙计沟通的唯一目的就是,有理有据地反应问题,并且引起他足够的重视,然后
让他去找老板。大家都是打工的,去为难伙计,让自己生气,有什么用呢? 注意,整个过程中,应该照顾到伙计和老板的心理(上文提到的)。按照上文心理的分析,伙计否认鱼有问题是很正常的;同时, 老板否认鱼有问题并且不想补偿,也是完全有可能的。
同时,当老板讲到这样一番话:“您好,我们卫生工作一直都做的很好,您反应的问题以前从没发生过;但是,我们始终相信,只有顾客的感觉才是最准确的!”,要会听,其实老板已经默认鱼有问题并且愿意做出补偿了,我们应该见好就收,这样让大家到都有面子。

上面每个角色合理的做法,都是先从考虑当事人的心理出发的。
俗话说,得人心者得天下;洞悉人心、洞察人性。掌握对方的心理是行动的前提。


我想,把上文中的老板看成主管,伙计是普通员工,而顾客就是客户的话,类似的案例是不是也经常发生在公司里呢?如果能设想当事人的心理,考虑到各方的利益,解决问题的过程又让大家
很有面子,问题是不是能圆满解决呢?曾仕强说,中国人大都急功近利、又很要面子,那只要照顾到对方利益的同时,又给足面子,就无往不利了。

posted @ 2008-10-18 16:41 laifangsong 阅读(2298) | 评论 (30)编辑

2007年12月17日


问题如上,
点文字链接到本页面,Request.Referrer是可以获得url来源地址的,但点击flash内的链接到本页面,就获取不到了。

不知道有没解决方法,谢谢!

posted @ 2007-12-17 12:31 laifangsong 阅读(478) | 评论 (3)编辑

2007年8月29日


以前在网上看到:“要想成为老总,从现在起马上就要注意观察老总是怎么做事,做人的”

想想很有道理,的确,一个人进步最快的途径就是向高手学习,模仿什么样的人,以后很可能就能成为这种人。

但也不是光模仿,模仿+吸收精华思想+创新 才是成功之道。

一个多月的观察,发现老总工作、分配任务等暗含着以下思想:


重视思想,别太在意特定的工具

需求核心
 提炼出核心需求(验证可行性)->陆续添加其余功能(边加边单元测试)->最终集成测试和压力测试


分组
 职责(人/人),相似功能分开(两个文件)
 将task过程中的邮件也一起发到评论中
 报告中一组的整理在一起

最小化
 任务时间能短尽量短,简单的任务能完成的尽快finish
 分配权限较细 
 没有修改的文件一定不要check out
 
交接
 文档更替,一定要有成果记录
 提供接口
 请假等

持续改善
 有可能升级的软件,经常做 code review
 对每天的行为跟前一天对比,有什么差异
 日报由30分钟改为20分钟

统一
 做统一的标准,严格遵守(例:文件名,编码规范)
 统一utf-8编码

参照
 内部开发使用task 2007,再不断发现问题,更新版本
 做规范时,参照之前或别人做好的规范

预计
 考虑将要开发的东西,先想设计思路,不要求立即编码
 安排时间时,对正在做的东西,要设定个目标,要有个预估时间,要有时间限制

交替
 互相code review 对方的代码
 交替写测试文档规范

公用
 基类
 写文档时,整理出公用的元素:背景色,间距,宽度以及其他格式等

优先级
 上班最合适时间做最重要的任务,跟公司无直接关系的应放在下班做

敏感
 修改一处,测试全部
 bug多时,多做开发;少时,多做测试
 及时接受邮件,查看消息,及时回复
 
 


 


 

posted @ 2007-08-29 12:38 laifangsong 阅读(162) | 评论 (1)编辑

2007年8月7日


在csdn数据结构看到个热门帖子,奶牛问题:
一只刚出生的小牛,4年后生一只小牛,以后每年生一只。
现有一只刚出生的小牛,问20年后共有牛多少只?

我算出来的是345只,跟答案一致。

用递归写了下算法,自己感觉挺不好理解的。不知道有没有不用递归的算法,或者递归程序写的比较好理解的。
以下是代码:

        private int StatCount(int year)
        {
            
int bornCount;
            
if(year<4)
            {
                bornCount 
= 1;
            }
            
else
            {
                
int sum = 1;
                
for(int i=4; i<=year; i++)
                {
                    sum 
+= StatCount(i-4);
                }
                bornCount 
= sum;
            }
            
return bornCount;
        }

posted @ 2007-08-07 12:09 laifangsong 阅读(330) | 评论 (6)编辑

2007年7月28日

     摘要: 去网上搜c#邮件发送程序时,基本找到的都是零散的函数,没做封装,有的连异常处理都没有;能用的调用起来也不太灵活方便,所以,特地做了个封装。代码中如果有错误,欢迎指正。以下是程序:usingSystem;usingSystem.Web.Mail;usingSystem.Collections;namespaceAsai.Mail{/**////<summary>///C#邮件发送类V1.... 阅读全文

posted @ 2007-07-28 14:04 laifangsong 阅读(1567) | 评论 (7)编辑

2007年6月14日


今天明白了几件事。

1。在公司或朋友之间,应该积极主动没错,但不要没有安排、不考虑自己能力能不能做到的情况下随意揽事来做,这样事情如果做不好,被人责怪;做的好,也不会特别感激(虽然不是想要那份感激)。如果因为这样破坏了自己的安排,占用了很多时间,更是得不偿失。

2。对别人给于的帮助、肯定、甚至一个微笑,都应该报有一颗感恩的心。

3。在公司里,做事的同时,更要懂得怎么做人。做事的能力是前提,但做人做不好,很难有做事或者提升的机会。做事规规矩矩,做人多留意、多揣摩、洒脱一些,在公司内才好立足。

posted @ 2007-06-14 11:28 laifangsong 阅读(144) | 评论 (0)编辑

2007年6月6日


很多时候用JMail发送邮件一直出错,常见原因有:
1。发送邮件服务器地址写错。如果用 163邮箱来发送,服务器地址应当写成 smtp.163.com
2。很多发送邮件服务器需要验证邮箱登录名(例:laifangsong@163.com)和密码(123456),如果这两样没提交,发送也会失败。
3。发件人邮箱地址和发送邮件服务器登录名不统一。

以下的代码已在asp中调试通过。

<%

Dim nReturnValue '发送函数
nReturnValue = SendMail_JMail("mail.qcmw.com""laifangsong#qcmw.com""倾城wap自动建站系统""laifangsong#qcmw.com""#123456#""laifangsong#126.com""注册成功提示""您在我们网站上注册成功!")
Select Case nReturnValue
Case 0
    Response.Write 
"邮件发送成功!"
Case 1
    Response.Write 
"创建JMail组件失败!"
Case 2
    Response.Write 
"邮件发送失败!"
End Select


'JMail发送邮件(4.4)
'
组件下载:http://www.52z.com/Down/3525.html
'
参数:发送邮件SMTP服务器, 发件人邮箱地址, 发件人姓名, 发送邮件服务器登录名, 发送邮件服务器登录密码, 接收人邮件地址, 邮件标题, 邮件内容
Function SendMail_JMail(s_SMTPServer, s_FromMail, s_FromName, s_MailServerUserName, s_MailServerPassword, s_ToEmail, s_Subject, s_Body)
    
On Error Resume Next
    
Set jmail = Server.CreateObject("JMAIL.Message")   '建立发送邮件的对象
    If Err.Number <> 0 Then
        SendMail_JMail 
= 1
        
Exit Function
    
End If

    jmail.silent 
= True    '屏蔽例外错误,返回FALSE跟TRUE两值
    jmail.logging = False   '启用邮件日志
    jmail.Charset = "GB2312"     '邮件的文字编码为中文
    jmail.ISOEncodeHeaders = False '防止邮件标题乱码
    jmail.ContentType = "text/html"    '邮件的格式为HTML格式
    jmail.AddRecipient s_ToEmail    '邮件收件人的地址
    jmail.From = s_FromMail  '发件人的E-MAIL地址
    jmail.FromName = s_FromName   '发件人姓名
    jmail.MailServerUserName = s_MailServerUserName    '登录邮件服务器所需的用户名
    jmail.MailServerPassword = s_MailServerPassword     '登录邮件服务器所需的密码
    jmail.Subject = s_Subject    '邮件的标题 
    jmail.Body = s_Body      '邮件的内容
    jmail.Priority = 1      '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值
    jmail.Send(s_SMTPServer)     '执行邮件发送(通过邮件服务器地址)
    jmail.Close()   '关闭对象
    
    
If jmail.ErrorCode <> 0 Then
        SendMail_JMail 
= 2
    
Else
        SendMail_JMail 
= 0
    
End If

End Function


'IIS中SMTP邮件服务器发送组件
Function SendMail_IISSMTP(s_FromMail, s_ToEmail, s_Subject, s_Body)
    
Set cdomail = Server.CreateObject("CDONTS.NewMail")  '建立邮件对象
    cdomail.Subject = s_Subject   '邮件标题
    cdomail.From = s_FromMail   '发件人的地址
    cdomail.To = s_ToEmail   '收件人的地址
    cdomail.Body = s_Body   '邮件的内容
    cdomail.Send    '执行发送
End Function

%
>




posted @ 2007-06-06 09:48 laifangsong 阅读(717) | 评论 (7)编辑

2007年5月30日


调用可以很灵活,代码如下:

using System;
using System.Configuration;
using System.Web;
using System.Web.UI;
using System.Text;
using System.IO;

namespace aspnet_test
{
    
/// <summary>
    
/// 单个文件上传类
    
/// 
    
/// 可以自定义:上传目录,上传文件类型、大小,是否使用随机上传文件名。
    
/// 
    
/// 作者:laifangsong  QQ:25313644  GMail:laifangsong@gmail.com
    
/// 原文:http://www.cnblogs.com/jiny-z/archive/2007/05/30/764762.html
    
/// </summary>
    public class UploadFile_Single
    {
        
/* web.config设置:
         * <appSettings>        
         *     <add key="uploadDir" value="UploadFiles/" />
         *   <add key="uploadFileExt" value="gif|jpg|jpeg|png|bmp|doc|xls|hlp|chm|rar|zip" />    
         *   <add key="uploadFileSize" value="2048" />
         *   <add key="isUseRandFileName" value="true" />            
         * </appSettings>
         * 
         * private string uploadDir = ConfigurationSettings.AppSettings["uploadDir"];;
         * private string uploadFileExt = ConfigurationSettings.AppSettings["uploadFileExt"];
         * private int uploadFileSize = int.Parse(ConfigurationSettings.AppSettings["uploadFileExt"]);
         * private bool isUseRandFileName = bool.Parse(ConfigurationSettings.AppSettings["uploadFileExt"]);
         * 
*/

        
//上传目录,相对于本文件路径;以“/”结尾;如果目录不存在,会自动创建;如果要启用绝对路径,写法:“/虚拟目录名称/上传文件目录名称/”
        private string uploadDir = "UploadFiles/";
        
//允许上传文件类型,逗号隔开
        private string uploadFileExt = "gif|jpg|jpeg|png|bmp|doc|xls|hlp|chm|rar|zip";
        
//允许上传文件大小,k 为单位
        private int uploadFileSize = 2048;
        
//是否使用随机上传文件名;如果不使用,会覆盖上传目录的同名文件
        private bool isUseRandFileName = true;

        
//上传结果
        private string uploadResult = "";
        
//上传文件保存路径
        private string uploadPath = "";
        
        
public string UploadDir
        {
            
get
            {
                
return uploadDir;
            }
            
set
            {
                uploadDir 
= value;
            }
        }
        
public string UploadFileExt
        {
            
get
            {
                
return uploadFileExt;
            }
            
set
            {
                uploadFileExt 
= value;
            }
        }
        
public int UploadFileSize
        {
            
get
            {
                
return uploadFileSize;
            }
            
set
            {
                uploadFileSize 
= value;
            }
        }
        
public bool IsUseRandFileName
        {
            
get
            {
                
return isUseRandFileName;
            }
            
set
            {
                isUseRandFileName 
= value;
            }
        }
        
public string UploadResult
        {
            
get
            {
                
return uploadResult;
            }
        }
        
public string UploadPath
        {
            
get
            {
                
return uploadPath;
            }
        }        


        
//上传文件方法
        public bool Upload(Page page)
        {
            HttpPostedFile uploadFile 
= page.Request.Files[0];
            
//获取上传文件属性
            string fileFullName = uploadFile.FileName;
            
string contentType = uploadFile.ContentType;
            
int contentLength = uploadFile.ContentLength;
            
//取得文件名
            string fileName = System.IO.Path.GetFileName(fileFullName);
            
//取得扩展名
            string fileExt = System.IO.Path.GetExtension(fileName).Remove(01);
            
//检测文件类型
            if( ("|"+UploadFileExt+"|").IndexOf( ("|"+fileExt+"|") ) < 0 )
            {
                uploadResult 
= "<font color='red'><b>上传文件格式错误!允许上传文件类型(" + uploadFileExt + ")</b></font>";
                
return false;
            }
            
//检测文件大小
            if(contentLength<1 || contentLength>uploadFileSize*1024)
            {
                uploadResult 
= "<font color='red'><b>上传文件大小错误!最大允许上传 " + uploadFileSize + " KB</b></font>";
                
return false;                
            }
            
//如果上传目录不存在,创建目录
            if(!uploadDir.EndsWith("/")) uploadDir += "/";
            
string tempPath = "";
            
string tempMapPath = "";
            
string tempDir = uploadDir.Substring(0,1)!="/" ? uploadDir : uploadDir.Substring(uploadDir.IndexOf("/"2)+1) ;
            
while(tempDir.IndexOf("/")>=0)
            {
                tempPath 
+= tempDir.Substring(0, tempDir.IndexOf("/")+1);            
                tempMapPath 
=  System.Web.HttpContext.Current.Server.MapPath(tempPath);
                
if(!Directory.Exists(tempMapPath))
                {
                    Directory.CreateDirectory(tempMapPath);
                }
                tempDir 
= tempDir.Substring(tempDir.IndexOf("/")+1);
            }
            
//随机文件名
            if(isUseRandFileName)
            {
                fileName 
= DateTime.Now.ToString("yyyyMMddhhmmss"+ (new Random()).Next(1001000).ToString() + "." + fileExt;
            }

            
string saveFilePath =  System.Web.HttpContext.Current.Server.MapPath(uploadDir) + @"\" + fileName;            
            uploadFile.SaveAs(saveFilePath);

            uploadPath 
= uploadDir+fileName;
            
//SaveUploadPathToDB(uploadPath);

            uploadResult 
+= "<font color='blue'><b>文件上传成功!</b></font>" + "<br/><br/>" +
                
"<b>保存位置:</b>" + uploadPath;
    
            
return true;
        }

        
//将上传文件路径存入数据库
        private void SaveUploadPathToDB(string uploadPath)
        {
            
//string sql = "update table 1 set f_uploadpath='" & uploadPath & "' where ";
            
//TSQL.ExecuteNonQuery(sql, null);
        }

    }
}


调用:

UploadFile_Single upfile = new UploadFile_Single();
upfile.Upload(
this);

            UploadFile_Single upfile = new UploadFile_Single();
            upfile.UploadDir 
= "UploadFiles/";
            upfile.UploadFileExt 
= "gif|jpg|jpeg|png|bmp";
            upfile.UploadFileSize 
= 1024;
            upfile.IsUseRandFileName 
= true;
            upfile.Upload(
this);

            UploadFile_Single upfile = new UploadFile_Single();
            upfile.UploadDir 
= "/虚拟目录名称/UploadFiles/1/2/3/";
            upfile.UploadFileExt 
= "gif|jpg|jpeg|png|bmp";
            upfile.UploadFileSize 
= 1024;
            upfile.IsUseRandFileName 
= true;
            upfile.Upload(
this);
               
               Response.Write(upfile.UploadResult); //上传结果信息
               Response.Write(upfile.UploadPath); //上传保存路径
(上传目录可以用绝对路径,也可用相对路径;如果上传目录不存在,会自动创建)


 

 

 

posted @ 2007-05-30 09:53 laifangsong 阅读(691) | 评论 (0)编辑

2007年4月24日


asp.net使用表单验证控件时,会调用 /aspnet_client中的js脚本。

你如果在2000或xp上做开发,用到验证控件,当系统迁移到 win2003下运行时,记得用win2003的 /aspnet_client,不要用2000或xp的 /aspnet_client,否则会出现表单不能提交等错误!

今天就遇到这个问题,调了个半死,呵呵。

posted @ 2007-04-24 17:40 laifangsong 阅读(504) | 评论 (1)编辑

2007年4月14日


最近做一个小系统,在系统管理后台,做了一个PageBase类,供后台其他页面继承。
在该类的构造函数中验证是否Session有值;有值表示处于登录状态,否则返回后台登录页面。

但一写类似这样的代码: if(Session["key"]!=""){...}, 就提示错误:
只有在配置文件或 Page 指令中将启用会话状态设置为真时,才可以使用会话状态
代码大略这样:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
   public PageBase()
   {
         if(Session["Key"]!="")
         {
               ...
         }  
   }
   ...
}
Admin_Index.aspx:
================
...
...

Admin_Index.cs
================
public class Admin_Index : PageBase
{
   ...
   private void Page_Load(object sender, System.EventArgs e)
   {
        ...
   }
   ...
}

做了以下测试,查找原因:
1.  在 Admin_Index.cs的Page_Load事件中读写Session,结果:一切正常,可以正常赋值
2.  在 Admin_Index.cs的构造函数中读写Session,结果:提示同样错误
3.  在 PageBase.cs的任意位置读写Session,结果:提示同样错误
似乎只能在Page_Load等系统事件中,才能正常读写。

google了一下,发现可能的几个原因:
1.web.config中 <page enableSessionState="false" />,应为"true"
2.aspx页面中的<mailto:%@%20Page&amp;amp;nbsp;&amp;amp;nbsp;enableSessionState="false">,应为"true"
3.Session["key"]="" 改为 System.Web.Httpcontent.Current.Session["key"]=""

由于Page_Load事件中Session读写正常,基本可以排除上面几个原因;并且可以判断可能是 Session写错了地方。

之后,又搜到一篇:http://www.nqqn.com/ym/183/102910.htm
了解到大概原因:在构造函数运行时,Httpcontent.Current.Session对象未生成,不能引用.
(google下 asp.net事件模型,可以了解下 Session对象是何时产生的);将Session读写放在PaeBase.cs的OnInit事件中,不再有错误。


正确写法:
PageBase.cs:
================
public class PageBase : System.Web.UI.Page
{
   public PageBase()
   {
   }


  protected override void OnInit(System.EventArgs e)
   {
          if(Session["Key"]!="")
         {
               ...
         }       
   }
}

posted @ 2007-04-14 17:45 laifangsong 阅读(604) | 评论 (4)编辑