Razor中的ViewBag.Title是什么?

Yod*_*oda 26 asp.net-mvc razor

什么是ViewBag.Title在ASP.NET MVC 4?

我有那个View文件:

@model IEnumerable<MvcMusicStore.Models.Genre>

@{
    ViewBag.Title = "Store";
}

<h2>Index</h2>
Run Code Online (Sandbox Code Playgroud)

我不知道改变ViewBag.Title可能会做什么.

Jus*_*son 40

ASP.NET站点:

ViewBag是一个动态对象,这意味着你可以把任何你想要的东西放进去; ViewBag对象没有已定义的属性,直到你在其中放入一些东西.

ViewBag.Title属性只是一个字符串对象.在这种情况下,它在视图中被用于实际定义Title属性.如果您要查看_Layout.cshtml文件,您可能会看到以下内容:

<title>@ViewBag.Title</title>
Run Code Online (Sandbox Code Playgroud)

还记得在视图中定义属性的时候吗?最终呈现页面时,该属性最终出现在HTML标记中,如下所示:

<title>Store</title>
Run Code Online (Sandbox Code Playgroud)

哪个设置浏览器标题.

  • 无论我想要什么,也意味着在其中放置一个复杂的对象?我知道这可以通过将对象传递给模型来完成,但这是可行的吗? (2认同)

Cod*_*shi 10

ViewBag是一个动态对象,因此您可以在其上定义任何属性.在这种情况下@ViewBag.Title分配一个字符串.在_Layout.cshtml页面中,您将看到以下代码行:

<title>@ViewBag.Title</title>
Run Code Online (Sandbox Code Playgroud)

任何使用_Layout.cshtml布局的视图都会有一行代码如下:

@{
    // This is setting the property to Hahaha
    ViewBag.Title = "Hahaha"; 
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,那么最终你将完成(见红色圆圈)显示浏览器中页面标题的内容:

在此输入图像描述


在你的一条评论中,你会问:

无论我想要什么,也意味着在其中放置一个复杂的对象?我知道这可以通过将对象传递给模型来完成,但这是可行的吗?

换句话说,你问你是否可以在Title房产中放置一个复杂的物体?是的,你可以这样做,但要记住改变_Layout.cshtml文件中的代码,否则它只会调用ToString()你的复杂对象并在浏览器标题中打印结果.但你为什么要这样做?我不建议.但是,你可以把任何东西放进去,因为它是动态的,但你必须正确地使用它.你甚至可以创建这样的其他属性:

ViewBag.SomeOtherProperty = new MyClass() {...};
Run Code Online (Sandbox Code Playgroud)

但是,传递模型要好得多,因为它可以为您提供编译器支持,并且您也可以获得智能.