您的位置:首页 > 编程语言 > ASP

MVC中,ViewData的注意事项

2014-09-15 00:23 344 查看
ViewData:

msdn上的解释是:获取或设置一个字典,其中包含在控制器和视图之间传递的数据。

从其字面意义上来讲,view的data,用来传递数据的,在MVC4中,常用的还有viewbag来传递数据。

ViewData与ViewBag的区别

1、ViewData是字典类型,赋值方式用字典方式,通过key值读取对应的value, ViewData["myName"]

2、ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.myName

3、ViewBag和ViewData只在当前Action中有效,等同于View

4、ViewData和ViewBag 中的值可以互相访问,因为ViewBag的实现中包含了ViewData


下面说正题:

为什么我要让你们慎用呢,还得从我3个月前做的一个项目开始说起

3个月前,基于asp.net MVC4做了一个网站



在一个action里,return到其他view的时候,发现需要传递一个id参数,用什么来传呢?

(A action return到 B action)

我直接就想到了用viewdata,在A action里,设置了一个viewdata["id"]="xx";

然后在B action里获取这个id的值,很方便,就这2行代码,省事。

运行也没出什么问题,完美运行。



但项目上线后,客户老是说,你的网站怎么总是崩溃呀,总是进不去,查看服务器日志,找不到原因,还以为是数据库的原因,于是开始了漫长的Debug日子,这Debug长达3个月,各种问题都找遍了,各种代码都优化了,问题还是出现,于是没办法,只能定期重启iis,几十分钟重启一次,但这样会出现session丢失,客户也抱怨,体验不好,老是重新登录。



后来无意间,在优化网站过程中,去掉了viewdata来传值,居然发现网站就不会崩溃了,很纳闷。

这个问题,google,百度也没找到相关的资料,于是自己研究了一下,我猜估计是viewdata,是存在与当前action里的,但我是Aaction直接return了Baction,估计这个return的过程中,两个action都在调用,因为是在A
action里声明创建,而return到B action里,将这个viewdata传递过来后,因为Viewdata只对当前action有效,离开则销毁,但这种情况下,我销毁的是B action,所以导致这个viewdata一直没法销毁,网站就崩溃。


以前看到过有篇文章说,viewdata的数据只需要几k或者几十k就足以导致网站崩溃,或许就是这个原因把。

这个坑,坑了我几个月,希望此文章能献给MVC开发中,跟我范同样错误的朋友借鉴参考。

至于我的猜测,是否准确,还希望大牛来指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息