C# .Net Razor-在页面之间共享变量

C# .Net Razor-在页面之间共享变量,c#,asp.net,razor,web,C#,Asp.net,Razor,Web,我为这个问题提前道歉。我习惯了经典的ASP,正在用.NETASP网页(cshtml)测试水 我创建了一个cshtml页面(Index.cshtml),其中包括一个页眉和一个页脚。我正在使用 @RenderPage("~/Shared/_Header.cshtml") @RenderPage("~/Shared/_Footer.cshtml") 在Index.cshtml的顶部,我想设置一个变量: var topNav = "services"; 我想从页眉和/或页脚访问此变量。如何实现这一点

我为这个问题提前道歉。我习惯了经典的ASP,正在用.NETASP网页(cshtml)测试水

我创建了一个cshtml页面(Index.cshtml),其中包括一个页眉和一个页脚。我正在使用

@RenderPage("~/Shared/_Header.cshtml")
@RenderPage("~/Shared/_Footer.cshtml")
在Index.cshtml的顶部,我想设置一个变量:

var topNav = "services";

我想从页眉和/或页脚访问此变量。如何实现这一点?

其中一个选项是使用ViewBag:


其中一个选项是使用ViewBag:


更新:由于这不是MVC4站点,而是独立的Razor模板,MVC的标准答案不适用。此页面显示如何使用PageData对象在页面之间传递数据

我最初的答案并不适用,但概念仍然有效:

至少有四个对象可以用来实现这一点。也许最简单的方法是查看包。有关更多详细信息,请参阅

@{
    ViewBag.topNav = "services";
}
public class IndexViewModel {
   public string TopNav { get; set; }
   // other view properties here
}
您可能会发现这有点问题,因为ViewBag不提供强类型属性。如果ViewBag.topNav不存在,则访问时将返回null

但是,本文中的容器都不会提供类型检查。这就引出了第四个可以处理这个问题的对象。这是传递给视图的模型对象。有关更多详细信息,请参阅

@{
    ViewBag.topNav = "services";
}
public class IndexViewModel {
   public string TopNav { get; set; }
   // other view properties here
}
在控制器中:

public ActionResult Index() {
   var model = new IndexViewModel {
      TopNav = "services",
      // set other properties here
   }
   return View(model);
}
在索引视图中:

@model IndexViewModel

@RenderPage("~/Shared/_Header.cshtml",Model)
_Header.cshtml:

@model IndexViewModel
<h2>@Model.topNav</h2>
@model IndexViewModel
@Model.topNav

最后一个要注意的事项是考虑使用共享Layut.cStML,而不是在每个页面中嵌入页眉和页脚。

更新:因为这不是MVC4站点,而是独立的RAMOR模板,MVC的标准答案不适用。此页面显示如何使用PageData对象在页面之间传递数据

我最初的答案并不适用,但概念仍然有效:

至少有四个对象可以用来实现这一点。也许最简单的方法是查看包。有关更多详细信息,请参阅

@{
    ViewBag.topNav = "services";
}
public class IndexViewModel {
   public string TopNav { get; set; }
   // other view properties here
}
您可能会发现这有点问题,因为ViewBag不提供强类型属性。如果ViewBag.topNav不存在,则访问时将返回null

但是,本文中的容器都不会提供类型检查。这就引出了第四个可以处理这个问题的对象。这是传递给视图的模型对象。有关更多详细信息,请参阅

@{
    ViewBag.topNav = "services";
}
public class IndexViewModel {
   public string TopNav { get; set; }
   // other view properties here
}
在控制器中:

public ActionResult Index() {
   var model = new IndexViewModel {
      TopNav = "services",
      // set other properties here
   }
   return View(model);
}
在索引视图中:

@model IndexViewModel

@RenderPage("~/Shared/_Header.cshtml",Model)
_Header.cshtml:

@model IndexViewModel
<h2>@Model.topNav</h2>
@model IndexViewModel
@Model.topNav


最后一个要注意的事项是考虑使用共享Layut.cStML,而不是在每个页面中嵌入页眉和页脚。

使用一个或强类型的模型。@ PASTHOTE-我不建议使用VIEWBACK,因为它不是强类型的.@ XWEB-您通过“服务”一词来实现什么?是否指向页眉或页脚部分?@xweb-另外,页眉和页脚部分是否显示在其他页面以及索引中?如果是这样的话,它们可能更适合放在布局视图中。@危险-记住,我来自经典ASP。我通常在主页中设置变量,并从包含的页面(如页眉/页脚)访问它们。在本例中,头文件有一个导航菜单(Home | Services | Contact |等)。如果我在特定页面(或页面子集)上,我会突出显示导航元素。在这种情况下,如果变量topNav=“services”,我可以突出显示“services”导航元素。如果topNav=“contact”,我可以突出显示“contact”。使用一个或强类型的模型。@pasty-我不建议使用ViewBag,因为它不是强类型的。@xweb-通过将“服务”一词传递到页眉或页脚部分来实现什么目的?@xweb-还有,页眉和页脚部分是否显示在其他页面以及索引中?如果是这样的话,它们可能更适合放在布局视图中。@危险-记住,我来自经典ASP。我通常在主页中设置变量,并从包含的页面(如页眉/页脚)访问它们。在本例中,头文件有一个导航菜单(Home | Services | Contact |等)。如果我在特定页面(或页面子集)上,我会突出显示导航元素。在这种情况下,如果变量topNav=“services”,我可以突出显示“services”导航元素。如果topNav=“contact”我可以突出显示“contact”。@Vitaly-我将把这个可视包代码放在哪里?我有3个文件。index/header/footer.cshtml.@Vitaly-我将把这个ViewBag代码放在哪里?我有3个文件。index/header/footer.cshtml@B2K-感谢您的详细回复。我尝试了第一个选项,但收到一个错误“名称“ViewBag”在当前上下文中不存在”。在第二个示例中,我应该将“public class IndexViewModel”代码和“public ActionResult Index”代码放在哪里?我现在没有“控制器”。在MVC解决方案中,您应该看到一个控制器目录,其中包含一个名为HomeController.cs的文件。有关ViewModel的放置位置,请参阅我引用的文章。我不相信“ASP.NET网页”包含这些文件。没有.cs文件。您没有使用MVC4。由于您的问题标记不正确,我们都认为您使用的是ASP.NETMVC4。这是一个页面,将向您展示如何在您的站点中使用。该网站上还有更多教程可以帮助您。请参阅我关于使用PageData的更新。我想这就是你想要的,但是我没有办法测试它。@B2K-谢谢你的详细回复。我尝试了第一个选项,但收到一个错误“名称“ViewBag”在当前上下文中不存在”。在第二个示例中,我应该将“public class IndexViewModel”代码和“public ActionResult Index”代码放在哪里?我现在没有“控制器”。在MVC解决方案中,您应该看到一个控制器目录,其中包含一个名为HomeController.cs的文件。有关ViewModel的放置位置,请参阅我引用的文章。我不相信“ASP