zoukankan      html  css  js  c++  java
  • ASP.NET MVC中,在View和PartialView中"共享变量"的方法

    最近在做一些比较基础的部分,做到界面时想到一个问题:

    在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中的元素,果然得到了期望的结果。

    用法示例:

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

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

    “在派生类中重写时,获取一个键/值集合,该集合在 HTTP 请求过程中可以用于在模块与处理程序之间组织和共享数据。”

    经测试,使用:

        Context.Items["test"] = "abcd";
    
    的方式也能达到在两个View间“共享变量”的效果,但是我推荐使用第一种方法

  • 相关阅读:
    mysql u root p 等这些常用的参数
    关于类对象大小的 sizeof 计算问题
    sql like用法
    链表队列
    Zend Studio安装教程
    #define和inline 的区别
    ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)
    Ubuntu 10.04下LAMP环境的配置与使用教程
    win7保护视力的电脑设置
    sql between and 用法
  • 原文地址:https://www.cnblogs.com/think8848/p/2081554.html
Copyright © 2011-2022 走看看