在 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 【问题描述】:我希望我的视图能够为位于我的母版页中的<body>
标记指定一个类。
我的第一个想法是做这样的事情:
<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 - 将最后创建的 id 从操作传递到部分视图