2014-07-08 65 views
1

对于noob问题,我提前表示歉意。我习惯于使用经典ASP,并使用.Net ASP网页(cshtml)测试水域。.Net Razor - 页面间共享变量

我创建了一个cshtml页面(Index.cshtml),它将包含一个页眉和一个页脚。我使用

@RenderPage("~/Shared/_Header.cshtml") 
@RenderPage("~/Shared/_Footer.cshtml") 

在Index.cshtml的顶部,包括他们,我想设置一个变量:

var topNav = "services"; 

我想从页眉和/或页脚访问这个变量。我怎样才能做到这一点?

+0

使用[ViewBag](http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-cplusViewBagplusandplusTem)或强类型模型。 – pasty

+0

@pasty - 我不会推荐使用ViewBag,因为它没有强类型。 – Dangerous

+0

@xweb - 通过将“服务”一词传递给页眉或页脚部分,您试图实现的是什么? – Dangerous

回答

1

更新:由于这是不是一个MVC4网站,但独立的剃须刀模板,为MVC标准答案不适用。这个页面展示如何通过使用PageData对象Customizing Site-Wide Behavior

我原来的答复并不真正适用的页面之间的数据,但其概念仍然是有效的:

有可用于完成至少四个对象这个。也许最简单的是ViewBag。有关更多细节,请参阅When to use ViewBag, ViewData...

@{ 
    ViewBag.topNav = "services"; 
} 

您可能会发现有点问题,因为ViewBag不提供强类型属性。如果ViewBag.topNav不存在,它将在访问时返回null。

但是,文章中的容器都不会提供类型检查。这使我能够处理这个问题的第四个对象。这是传递给视图的模型对象。有关更多详细信息,请参见Using ViewModels

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> 

一个要注意的最后一个项目是考虑使用Shared Layout.cshtml而不是嵌入标头每页中的页脚。

+0

@ B2K-感谢您的详细回复。我尝试了第一个选项并收到错误“名称'ViewBag'在当前上下文中不存在”。在第二个例子中,我应该在哪里放置“public class IndexViewModel”代码和“public ActionResult Index”代码?我现在没有“控制器”。 – xweb

+0

在您的MVC解决方案中,您应该看到一个名为HomeController.cs的文件的控制器目录。 有关放置ViewModel的位置,请参阅我引用的文章。 – B2K

+0

我不相信“ASP.NET网页”包含这些文件。没有.cs文件。 http://www.asp.net/web-pages/tutorials/introducing-aspnet-web-pages-2/getting-started – xweb