6106 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-04-24
  • 特朗普所言克里米亚是俄罗斯的和出尔反尔对中国500亿美元商品宣布开征巨额关税,此两点已形成了鲜明的对比,从而充分的暴露了美国真实的战略意图。(原创首发) 2019-04-24
  • 中央宣传部、全国总工会向全社会发布2018年“最美职工” 2019-04-23
  • 只有买房才能幸福?张天翼《粉墨》:北漂生活的戏谑与哀愁 2019-04-23
  • 荷兰成国旗最大购买地-热门标签-华商网数码 2019-04-22
  • 从朝美的对话和双方表现的诚意来看,形势正向好的方向发展。这应了中国那句解铃还需系铃人的老话,只有当事国之间的直接对话才能真正解决问题,其它都是弯路。 2019-04-22
  • 你爱看的极简艺术史:5分钟一览中华书法四千年 2019-04-21
  • 庆祝中国人民解放军建军90周年阅兵在朱日和联合训练基地隆重举行 2019-04-21
  • 逆天跨界!RIO花露水风味鸡尾酒现象级刷屏 2019-04-20
  • 渭南警方历时8个月破获特大毒品案 抓获11名吸贩毒人员 2019-04-19
  • 回复@海之宁:你还好意思提逻辑? 2019-04-18
  • “五毒月”禁忌应当学 竹林日记(0074) 2019-04-17
  • 高考倒计时九天:回望来时路,名家这样忆高考 2019-04-17
  • 4款D级豪华轿车对比 “大”并不是重点 2019-04-16
  • 股市跌得再狠,照样削尖脑袋想去圈钱 2019-04-15
  • 26| 806| 427| 838| 601| 742| 521| 193| 991| 618|