ASP.NET MVC 3中ViewBag.Title的替代方案

sor*_*rke 24 razor viewbag asp.net-mvc-3

默认情况下,ASP.NET MVC 3的新项目模板将以下内容添加到默认布局(razor中的母版页):

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

然后,视图必须包含以下内容以分配页面标题,例如:

@{
     ViewBag.Title = "Log On";
}
Run Code Online (Sandbox Code Playgroud)

也许这只是我自己的偏好,但我发现使用ViewBag来保持标题有点不对(我想的是太多魔术字符串的味道).所以我的问题是:对于使用ASP.NET MVC 3和razor(使用动态属性包)的人来说,这是推荐的最佳实践吗?或者你选择了更强类型的东西(可能涉及自定义基类?)

Pra*_*sad 26

我不认为asp.net MVC 3附带的默认标题处理功能有什么不好,没关系.

我个人这样做(下面写的)处理标题,我不支持下面的代码或说它比默认功能更好,它只是一个偏好.

<title>
    @RenderSection("Title");
</title>
Run Code Online (Sandbox Code Playgroud)

视图

@section Title
{
    write title
}
Run Code Online (Sandbox Code Playgroud)

有一点我可以建议改进默认功能

@{
    string pageTitle = @ViewBag.Title ?? "Title Not Set";
}
<title>@pageTitle</title>
Run Code Online (Sandbox Code Playgroud)

因此,每当您忘记在viewbag中添加它时,页面将显示title = Title Not Set

创建基类然后使所有控制器继承自该基类也可以完成.但我认为它带来了太多的痛苦title.


Luk*_*tný 7

标题的ViewBag非常好(我甚至说它是ViewBag的目的) - 动态不是绝对的邪恶."标题"是众所周知的,不太可能改变甚至在视图模板中预定义.我个人使用以下标题:

<title>@(ViewBag.Title == null ? string.Empty : ViewBag.Title + " | ")Site Name</title>
Run Code Online (Sandbox Code Playgroud)

如果您担心ViewBag.Title错误输入,可以通过创建自定义来使其成为强类型,WebViewPage但您仍然必须使用ViewBag或者可能HttpContext.Items在强类型属性中使用,因为WebViewPage在渲染IIRC期间会创建多个实例.

我建议坚持ViewBag,创造自己,WebViewPage因为这似乎有点矫枉过正 - 如果你已经拥有自定义,即使在它上面创建单一属性也WebViewPage只是毫无价值的并发症 - 而且这来自于经常过度工程的人.