在 ASP.NET MVC 中将 ID 放在 <body> 上

Posted

技术标签:

【中文标题】在 ASP.NET MVC 中将 ID 放在 <body> 上【英文标题】:Putting an ID on <body> in ASP.NET MVC 【发布时间】:2009-10-01 12:52:44 【问题描述】:

我希望我的视图能够为位于我的母版页中的&lt;body&gt; 标记指定一个类。

我的第一个想法是做这样的事情:

<asp:Content ContentPlaceHolderID="BodyClassContent" runat="server">
    view-item</asp:Content>

但是,这需要在母版页中使用,这不起作用:

<body class="<asp:ContentPlaceHolder ID="BodyClassContent" runat="server" />">

有什么解决办法吗?

【问题讨论】:

如果你不想让 ViewModel 持有这个,你的视图中的 javascript 可以做 ;-) 另一个疯狂的想法是使用您的 BodyCss 属性自定义 ViewPage 类;不确定您是否可以足够早地设置它,但这只是一个想法。老实说,只需使用 ViewData/ViewModel 就可以了 ;-) 或自定义视图引擎,如 Spark。 【参考方案1】:

在布局中你可以在body标签上这样做:

<body @RenderSection("BodyAttributes", false)>

然后在您看来,您可以这样做:

@section BodyAttributes 
    id="login" class="login"

编辑:我今天也必须使用 VB.NET 和 WebForms 来完成这项工作,并找到了一个方便的链接来实现 equivalent

【讨论】:

【参考方案2】:

我会建议一种不同的方法。

您从 MasterModel 开始创建视图模型的层次结构。当您实例化一个视图对象时,您将一个主体类传递给它。

public class MasterModel

    string BodyCss  get; set; 

    public MasterModel (string bodyCss)
    
        BodyCss = bodyCss;
    


public class MyView1Model : MasterModel
    : base ("body-view1")


然后在你的主视图中,应该强类型到 MasterView:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MasterModel>" %>

你只要写:

<body class="<%= Model.BodyCss %>"></body>

【讨论】:

好主意,但我宁愿在我的模型中没有这个类——我希望视图单独负责布局,从而负责 CSS。【参考方案3】:

您还可以在希望设置它的视图中指定 body id 属性:

@
ViewBag.Title = "Test";
ViewData["BodyID"] = "test";
Layout = "~/Views/Shared/_Layout.cshtml";

这有助于将视图与控制器解耦,控制器(和/或视图模型)不需要知道 body 标签的 id 属性。

在母版页中设置body标签的id,如下所示:

<body id="@ViewData["BodyID"]">

【讨论】:

好答案。当 MVC 仅与 WebForms 视图捆绑在一起时,有人提出了这个问题 - Razor 让这变得更好。【参考方案4】:

你为什么不在你的母版页中做:

<body class="<%=ViewData["bodyClass"].toString()%>">

然后在您的控制器操作中设置 ViewData["bodyClass"]?那应该是等价的……

【讨论】:

以上是关于在 ASP.NET MVC 中将 ID 放在 <body> 上的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 视图中将主键转换为实际名称/描述符字段

ASP.NET mvc html 列显示

ASP.NET MVC 3 文件夹结构

Asp.Net mvc - 将最后创建的 id 从操作传递到部分视图

在 ASP.NET MVC3 中正确使用 TempData?

在 ASP.NET MVC 中将 FormsIdentity 替换为 WindowsIdentity