如何根据Asp.Net MVC中的视图设置类?

时间:2010-08-04 14:35:09

标签: asp.net-mvc

我希望根据视图设置<body>类。

我已经阅读了一些关于强烈输入母版页但没有一篇文章似乎完全适合的帖子,或者至少我不知道如何编写代码。

我注意到Stack Overflwow会这样做,所以它必须是可能的。

更新

获取错误:Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS1061: 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'Body' and no extension method 'Body' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?)

上的

body

namespace MySite.Helpers
{
    public static class HtmlHelpers
    {
        public static MvcHtmlString Body(this HtmlHelper htmlHelper)
        {
            string currentControllerName = (string)htmlHelper.ViewContext.RouteData.Values["controller"];
            string currentActionName = (string)htmlHelper.ViewContext.RouteData.Values["action"];
            string css = currentControllerName + "-" + currentActionName;
            var body = new TagBuilder("body");
            body.AddCssClass(css);
            return MvcHtmlString.Create(body.ToString(TagRenderMode.StartTag));
        }
    }

}

〜/查看/共享/的Site.Master:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
</head>

<body id="argh" class="<%= Html.Body() %>">

2 个答案:

答案 0 :(得分:3)

您可以使用辅助方法:

public static MvcHtmlString Body(this HtmlHelper htmlHelper)
{
    string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
    string currentActionName = (string)helper.ViewContext.RouteData.Values["action"];
    string css = GetCss(currentControllerName, currentActionName);
    var body = new TagBuilder("body");
    body.AddCssClass(css);
    return MvcHtmlString.Create(body.ToString(TagRenderMode.StartTag));
}

然后在您的母版页中:

<%= Html.Body() %>
    ...
</body>

答案 1 :(得分:0)

您可以在布局cshtml文件中执行以下操作:

<body class="@HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString().ToLower() @HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString().ToLower()-@HttpContext.Current.Request.RequestContext.RouteData.Values["action"].ToString().ToLower()">

将呈现给:

<body class="controller controller-action">

这应该允许您编写特定于页面的CSS或您计划使用它的任何内容。当然,如果您觉得它太长,您可以将所有代码合并到一个方法中。