ASP.NET MVC2:根据查询字符串参数修改master css属性

时间:2010-09-17 07:39:51

标签: asp.net asp.net-mvc-2 code-behind master

我正在使用ASP .NET MVC2将网站迁移到新网站。

在原始站点中,母版页具有代码隐藏功能,可以检查查询字符串参数值。根据此值,代码隐藏动态修改一些CSS属性以隐藏/显示母版页元素。

由于MVC2没有代码隐藏,因为我们应该在控制器中执行所有操作,在这种情况下我该如何处理呢?

我看到了这一点:asp.net mvc modifying master file from a view

它部分满足了我的需求,但查询字符串处理对所有页面都是通用的。如何在公共代码部分中移动此处理?

问候。

2 个答案:

答案 0 :(得分:1)

辅助方法看起来很合适:

public static class HtmlHelperExtensions
{
    public static string GetCss(this HtmlHelper htmlHelper)
    {
        // read some request parameter
        // here you also have access to route data so the
        // parameter could be part of your custom routes as well
        var foo = htmlHelper.ViewContext.HttpContext.Request["foo"];

        // based on the value of this parameter 
        // return the appropriate CSS class
        return (foo == "bar") ? "barClass" : "fooClass";
    }
}

在主页的某处:

<body class="<%= Html.GetCss() %>">

或者如果您总是将它应用于body标签,那么为了减少标签汤可能更合适:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString StartBody(this HtmlHelper htmlHelper)
    {
        var body = new TagBuilder("body");
        var foo = htmlHelper.ViewContext.HttpContext.Request["foo"];
        var bodyClass = (foo == "bar") ? "barClass" : "fooClass";
        body.AddCssClass(bodyClass);
        return MvcHtmlString.Create(body.ToString(TagRenderMode.StartTag));
    }
}

并在您的母版页中body代码的位置:

<%= Html.StartBody() %>

答案 1 :(得分:0)

我可以想到两个解决方案:

  1. 从一个控制器基础派生您的控制器,并根据发布的表格值设置ViewData参数

  2. 根本不要使用ViewData,只是在视图中查找表单值(使用HttpContext.Current)

  3. 第二种方法违反了MVC模式。 IMO在某些情况下仍然可以接受,例如我使用此方法突出显示导航菜单中当前选定的项目。