1

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

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

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

我看到了这个:asp.net mvc 从视图中修改主文件

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

问候。

4

2 回答 2

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() %>
于 2010-09-17T07:44:31.093 回答
0

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

  1. 从一个控制器库派生您的控制器,并根据发布的 Form 值在那里设置 ViewData 参数

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

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

于 2010-09-17T07:45:59.150 回答