Razor视图引擎中的全局变量

5

我是否能够在Razor中使用类似于Spark View Engine中所谓的全局变量的功能?

所有这一切的重点是能够在一个部分中定义变量作为标题,并且能够稍后在另一个部分中设置或更改该变量的值。

在Spark中,您可以在一个部分中创建变量,就像这样(不完整的代码仅用于示例目的):

<html>
  <head>
    <global type='string' Title='"Site Name"'/>
    <title>${Title}</title>
  </head>
  <body>
    <div><use content="view"/></div>
  </body>
</html>

然后你可以将它设置在不同的视图或部分或其他位置:

<set Title='product.Name + " - " + Title'/>

如果我采用Razor或者其他方式解决类似的问题,我该怎么做呢?请指点。

2个回答

8
您可以在布局中使用ViewBag.Title:
<html>
  <head>
    <title>@ViewBag.Title - Site Name</title>
  </head>
  <body>
    <div>
        @RenderBody()
    </div>
  </body>
</html>

然后在视图中定义这个变量:

@model AppName.Models.Product
@{
    ViewBag.Title = Model.Name;
}

更新:

回答有关默认值的问题时,您可以使用“sections”。

<html>
  <head>
    <title>
    @if (IsSectionDefined("Title"))
    {
        RenderSection("Title")
    }
    else 
    {
        <text>Some default title</text>
    }
    </title>
  </head>
  <body>
    <div>
        @RenderBody()
    </div>
  </body>
</html>

然后在你的视图中,如果需要重新定义该部分,你可以这样做:

@section Title {
    <text>some redefined title here</text>
}

这似乎可行,但是如果我在布局中设置title的值(比如我想要一个默认值),然后在视图中“更改”它,它会保留第一个设置的值。现在,如果我不在布局上设置它,则会采用在视图上设置的值。有什么解决办法吗?谢谢! - bluediapente
@Lilitu88пјҢиҜ·жҹҘзңӢжҲ‘зҡ„е…ідәҺIsSectionDefinedе’ҢRenderSectionж–№жі•зҡ„жӣҙж–°гҖӮ - Darin Dimitrov
2
在这种情况下,你不需要使用Section。你可以在视图中使用以下表达式:@(ViewBag.Title ?? "默认标题") - marcind

0

您可以使用以下方法在视图中设置并覆盖此值:

 @PageData["myTitle"] = "Title 1";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接