5359 2
2016-03-29 Dodu 公司动态

北京快乐8彩经网 www.njo4h.com.cn 最近在做一些比较基础的部分,做到界面时想到一个问题:

在ASP.NET MVC(Razor View Engine)中,如果我要让多个项目之间共享一个_Layout.cshtml,那样的话对于维护程序和统一风格都是有比较大的帮助的。但是问题是,如果真的要共享的话,各个项目之间不同的元素该如何处理呢,比如:Logo,项目名称等??吹搅薩LogOnPartial.cshtml文件让我想起来一个方法,如果我在_Layout.cshtml里定义一个变量,然后再做一个Partial.cshtml,在这个Partial里为_Layout.cshtml中的变量赋值,这样不就行了吗,说简单点就是定义一个在Layout和Partial里面"共用"的变量不就解决了吗,赶紧试试。

结果是很快发现这貌似行不通,因为无论是Layout、View还是Partial,在运行时都是被编译成一个类,并且生成了这个类的实例,然后按照一定的顺序执行的,在设计阶段还没有实例呢,所以定义变量貌似不现实。于是又想到ViewBag和ViewData,试一下,又发现不行,各个View(Layout、Partial)中的ViewBag和ViewData实际上也是他们自已的,和其他的View没有关系,在Partial的ViewData里添加一个元素,到了Loyout里面根本就找不见了。

那么Partial和Layout之间有什么联系呢,答案很快出来了,Controller,他俩在生命周期存在时肯定是用了同一个Controller实例!赶紧调试下,果然发现在Partial执行时,Partial的ViewData和Controller的ViewData中的元素个数不同,这就说明他俩没有使用同一个引用,于是在Partial里向Controller的ViewData添加一个元素,然后在Layout中已经调用过Partial的代码下方尝试读取Controller.ViewData中的元素,果然得到了期望的结果。

用法示例:

ViewContext.Controller.ViewData.Add("test","abcd");

最后再查查MSDN,发现了另一个方法也能解决这个问题,即使用WebViewPage.Context.Items属性,Context的类型为HttpContextBase,其Items属性的描述如下:

“在派生类中重写时,获取一个键/值集合,该集合在 HTTP 请求过程中可以用于在??橛氪沓绦蛑渥橹凸蚕硎??!?

经测试,使用:

Context.Items["test"] ="abcd";

的方式也能达到在两个View间“共享变量”的效果,但是我推荐使用第一种方法。


发表评论:

wewewe

wewewe 2016-10-22

werqwer

werqwer 2016-10-22

<a href="12334"><a/>
  • 马拉维“红旗飘飘”十年间,中国工程印上了当地纸币 2019-02-19
  • 正义感爆棚:流浪狗“路见不平” 赶跑打劫男子 2019-02-19
  • 正常的家庭,都是有计划的。好吃懒做,吃了这餐,不知下餐在哪里的,才不知怎样计划! 2019-02-18
  • 长度能绕田径场一圈  加长版“复兴号”动车组将亮相京沪高铁 2019-02-17
  • 候选企业:扬子江药业集团 2019-02-16
  • 《世界杯相对论》:谁能站本届世界杯的C位? 2019-02-15
  • 国台办谈落实“31条惠台措施”取得新进展:“措施”在沪落地  有上海特色 2019-02-14
  • 53岁张曼玉近照曝光 笑容灿烂颜值依旧 2019-02-14
  • 重庆影视热咋变影视产业热 2019-02-13
  • 网友飞机偶遇出门工作的王菲,天后坐姿慵懒霸气,素颜也很美 2019-02-13
  • 向着太阳出发:2018里昂——广州新丝绸之路太阳能自行车骑行赛揭幕 2019-02-12
  • 解除现金贷“马甲”需要“穿透式监管” 2019-02-12
  • 网传陕西神木“两交警当街练散打” 实为四川绵阳 2019-02-11
  • 有没有上城客在越南的踪迹? 2019-02-10
  • 创新驱动成古镇产业提质增效的“法宝” 2019-02-09
  • 9| 170| 295| 626| 991| 991| 239| 403| 681| 574|