asp.netasp.net-mvc-2master-pagescode-behind

ASP.NET MVC2: modifying master css property depending on query string parameter


I am migrating a web site to a new one using ASP .NET MVC2.

In the original site, master page has code-behind to check a query string parameter value. Depending on this value, code-behind dynamically modify some CSS property to hide / display master page elements.

As MVC2 has no code-behind because we are supposed to perform everything in the controllers, how should I proceed in this case ?

I see this : asp.net mvc modifying master file from a view

It partially answers my needs but the query string processing is common to all pages. How can I move this processing in a common code section ?

Regards.


Solution

  • A helper method looks like a good place:

    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";
        }
    }
    

    And somewhere in your master page:

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

    Or if you are always going to apply it to the body tag only it might be more appropriate to do this in order to reduce the tag soup:

    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));
        }
    }
    

    and in your master page at the place of the body tag:

    <%= Html.StartBody() %>